Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.
streamWriterBufferedDataLost yönetilen hata ayıklama yardımcısı (MDA), öğesine StreamWriter yazıldığında etkinleştirilir, ancak Flush örneği yok edilmeden önce StreamWriter veya Close yöntemi daha sonra çağrılmaz. Bu MDA etkinleştirildiğinde, çalışma zamanı arabelleğe alınan verilerin içinde StreamWriterhala bulunup bulunmadığını belirler. Arabelleğe alınan veriler varsa MDA etkinleştirilir. ve WaitForPendingFinalizers yöntemlerini çağırmak Collect sonlandırıcıları çalıştırmaya zorlayabilir. Sonlandırıcılar aksi takdirde rastgele gibi görünen zamanlarda çalışır ve işlem çıkışında muhtemelen hiç çalışmaz. Bu MDA etkinken sonlandırıcıları açıkça çalıştırmak, bu tür bir sorunu daha güvenilir bir şekilde yeniden oluşturmaya yardımcı olur.
Belirtiler
A StreamWriter , son 1-4 KB'lık verileri bir dosyaya yazmaz.
Neden
verileri StreamWriter dahili olarak arabelleğe alır ve bu Close da arabelleğe alınan verileri temel alınan veri deposuna yazmak için veya Flush yönteminin çağrılması gerekir. Veya Close Flush uygun şekilde çağrılmazsa, örnekte arabelleğe alınan StreamWriter veriler beklendiği gibi yazılamayabilir.
Aşağıda, bu MDA'nın yakalaması gereken kötü yazılmış bir kod örneği verilmiştir.
// Poorly written code.
void Write()
{
StreamWriter sw = new StreamWriter("file.txt");
sw.WriteLine("Data");
// Problem: forgot to close the StreamWriter.
}
Önceki kod, bir çöp toplama tetiklenirse ve sonlandırıcılar tamamlanana kadar askıya alınırsa bu MDA'yi daha güvenilir bir şekilde etkinleştirir. Bu tür bir sorunu izlemek için bir hata ayıklama derlemesinde önceki yöntemin sonuna aşağıdaki kodu ekleyebilirsiniz. Bu, MDA'yı güvenilir bir şekilde etkinleştirmeye yardımcı olur, ancak elbette sorunun nedenini düzeltmez.
GC.Collect();
GC.WaitForPendingFinalizers();
Çözüm
Bir uygulamayı kapatmadan önce veya Flush üzerinde StreamWriter veya örneğine sahip herhangi bir kod bloğunu çağırdığınızdan Close StreamWriteremin olun. Bunu başarmak için en iyi mekanizmalardan biri, yazıcının yönteminin çağrılmasını ve örneğin doğru şekilde kapatılmasını sağlayacak Dispose bir C# using bloğuyla (UsingVisual Basic'te) örneği oluşturmaktır.
using(StreamWriter sw = new StreamWriter("file.txt"))
{
sw.WriteLine("Data");
}
Aşağıdaki kod, yerine usingkullanarak try/finally aynı çözümü gösterir.
StreamWriter sw;
try
{
sw = new StreamWriter("file.txt"));
sw.WriteLine("Data");
}
finally
{
if (sw != null)
sw.Close();
}
Bu çözümlerden hiçbiri kullanılamıyorsa (örneğin, bir StreamWriter statik değişkende depolanıyorsa ve ömrünün sonunda kodu kolayca çalıştıramıyorsanız), son kullanımından StreamWriter sonra çağrısı Flush yapmak veya özelliği ilk kullanımından AutoFlush önce olarak true ayarlamak bu sorundan kaçınmalıdır.
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;
}
Çalışma Zamanı üzerindeki etkisi
Bu MDA'nın çalışma zamanı üzerinde hiçbir etkisi yoktur.
Çıktı
Bu ihlalin oluştuğunu belirten bir ileti.
Yapılandırma
<mdaConfig>
<assistants>
<streamWriterBufferedDataLost />
</assistants>
</mdaConfig>