Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Nota
Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.
Asisten streamWriterBufferedDataLost penelusuran kesalahan terkelola (MDA) diaktifkan ketika StreamWriter ditulis ke, tetapi Flush metode atau Close tidak kemudian dipanggil sebelum instans StreamWriter dihancurkan. Ketika MDA ini diaktifkan, runtime menentukan apakah ada data buffer yang masih ada dalam StreamWriter. Jika data yang di-buffer memang ada, MDA diaktifkan. Memanggil Collect metode dan WaitForPendingFinalizers dapat memaksa finalizer untuk dijalankan. Finalizer akan berjalan pada waktu yang tampaknya segan- segan, dan mungkin tidak sama sekali pada proses keluar. Menjalankan finalizer secara eksplisit dengan MDA yang diaktifkan ini akan membantu mereproduksi jenis masalah ini dengan lebih andal.
Gejala
StreamWriter Tidak menulis 1–4 KB data terakhir ke file.
Penyebab
Buffer StreamWriter data secara internal, yang mengharuskan Close metode atau Flush dipanggil untuk menulis data yang di-buffer ke penyimpanan data yang mendasar. Jika Close atau Flush tidak dipanggil dengan tepat, data yang di-buffer dalam StreamWriter instans mungkin tidak ditulis seperti yang diharapkan.
Berikut ini adalah contoh kode yang ditulis dengan buruk yang harus ditangkap MDA ini.
// Poorly written code.
void Write()
{
StreamWriter sw = new StreamWriter("file.txt");
sw.WriteLine("Data");
// Problem: forgot to close the StreamWriter.
}
Kode sebelumnya akan mengaktifkan MDA ini dengan lebih andal jika pengumpulan sampah dipicu dan kemudian ditangguhkan hingga finalizer selesai. Untuk melacak jenis masalah ini, Anda dapat menambahkan kode berikut ke akhir metode sebelumnya dalam build debug. Ini akan membantu mengaktifkan MDA dengan andal, tetapi tentu saja tidak memperbaiki penyebab masalah.
GC.Collect();
GC.WaitForPendingFinalizers();
Resolution
Pastikan Anda memanggil Close atau Flush pada StreamWriter sebelum menutup aplikasi atau blok kode apa pun yang memiliki instans StreamWriter. Salah satu mekanisme terbaik untuk mencapai ini adalah membuat instans dengan blok C# using (Using di Visual Basic), yang akan memastikan Dispose metode untuk penulis dipanggil, sehingga instans ditutup dengan benar.
using(StreamWriter sw = new StreamWriter("file.txt"))
{
sw.WriteLine("Data");
}
Kode berikut menunjukkan solusi yang sama, menggunakan try/finally alih-alih using.
StreamWriter sw;
try
{
sw = new StreamWriter("file.txt"));
sw.WriteLine("Data");
}
finally
{
if (sw != null)
sw.Close();
}
Jika tidak satu pun dari solusi ini dapat digunakan (misalnya, jika StreamWriter disimpan dalam variabel statis dan Anda tidak dapat dengan mudah menjalankan kode pada akhir masa pakainya), maka memanggil StreamWriterFlush setelah penggunaan terakhirnya atau mengatur AutoFlush properti ke true sebelum penggunaan pertamanya harus menghindari masalah ini.
private static StreamWriter log;
// static class constructor.
static WriteToFile()
{
StreamWriter sw = new StreamWriter("log.txt");
sw.AutoFlush = true;
// Publish the StreamWriter for other threads.
log = sw;
}
Efek pada Runtime
MDA ini tidak berpengaruh pada runtime.
Hasil
Pesan yang menunjukkan bahwa pelanggaran ini terjadi.
Konfigurasi
<mdaConfig>
<assistants>
<streamWriterBufferedDataLost />
</assistants>
</mdaConfig>