Saya mendapat tugas yang bagus untuk mengetahui cara menangani file besar yang dimuat ke editor skrip aplikasi kami (ini seperti VBA untuk produk internal kami untuk makro cepat). Sebagian besar file berukuran sekitar 300-400 KB yang dapat dimuat dengan baik. Tetapi ketika mereka melampaui 100 MB, prosesnya mengalami kesulitan (seperti yang Anda harapkan).
Apa yang terjadi adalah bahwa file tersebut dibaca dan dimasukkan ke dalam RichTextBox yang kemudian dinavigasi - jangan terlalu khawatir tentang bagian ini.
Pengembang yang menulis kode awal hanya menggunakan StreamReader dan melakukan
[Reader].ReadToEnd()
yang bisa memakan waktu cukup lama untuk menyelesaikannya.
Tugas saya adalah memecah sedikit kode ini, membacanya dalam potongan menjadi buffer dan menampilkan bilah kemajuan dengan opsi untuk membatalkannya.
Beberapa asumsi:
- Kebanyakan file berukuran 30-40 MB
- Isi filenya adalah teks (bukan biner), ada yang berformat Unix, ada pula yang DOS.
- Setelah konten diambil, kami mencari tahu terminator apa yang digunakan.
- Tidak ada yang peduli setelah dimuat tentang waktu yang diperlukan untuk merender di kotak teks kaya. Ini hanya pemuatan awal teks.
Sekarang untuk pertanyaannya:
- Bisakah saya menggunakan StreamReader, lalu memeriksa properti Length (jadi ProgressMax) dan mengeluarkan Read untuk ukuran buffer yang ditetapkan dan mengulang-ulang sementara WHILST di dalam pekerja latar belakang, sehingga tidak memblokir thread UI utama? Kemudian kembalikan pembuat string ke utas utama setelah selesai.
- Isinya akan dikirim ke StringBuilder. dapatkah saya menginisialisasi StringBuilder dengan ukuran aliran jika panjangnya tersedia?
Apakah ini (menurut pendapat profesional Anda) ide bagus? Saya pernah mengalami beberapa masalah di masa lalu dengan membaca konten dari Streams, karena akan selalu melewatkan beberapa byte terakhir atau sesuatu, tetapi saya akan mengajukan pertanyaan lain jika ini masalahnya.