Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dieser Artikel ist spezifisch für .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.
Der streamWriterBufferedDataLost verwaltete Debugging-Assistent (Managed Debugging Assistant, MDA) wird aktiviert, wenn ein StreamWriter Skript geschrieben wird, die Methode Close wird jedoch Flush erst aufgerufen, bevor die Instanz der StreamWriter Datei zerstört wird. Wenn diese MDA aktiviert ist, bestimmt die Laufzeit, ob noch gepufferte Daten innerhalb der StreamWriter. Wenn gepufferte Daten vorhanden sind, wird die MDA aktiviert. Das Aufrufen der Und WaitForPendingFinalizers Methoden kann die Ausführung von Collect Finalizern erzwingen. Finalizer werden andernfalls zu scheinbar willkürlichen Zeiten und möglicherweise gar nicht beim Beenden des Prozesses ausgeführt. Das explizite Ausführen von Finalizern mit dieser aktivierten MDA hilft, diese Art von Problem zuverlässiger zu reproduzieren.
Symptome
A StreamWriter schreibt nicht die letzten 1 bis 4 KB Daten in eine Datei.
Ursache
Die StreamWriter Pufferdaten werden intern gepuffert, was erfordert, dass die oder die CloseFlush Methode aufgerufen wird, um die gepufferten Daten in den zugrunde liegenden Datenspeicher zu schreiben. Wenn Close oder Flush nicht ordnungsgemäß aufgerufen wird, werden die in der StreamWriter Instanz gepufferten Daten möglicherweise nicht wie erwartet geschrieben.
Im Folgenden sehen Sie ein Beispiel für schlecht geschriebenen Code, den dieser MDA abfangen sollte.
// Poorly written code.
void Write()
{
StreamWriter sw = new StreamWriter("file.txt");
sw.WriteLine("Data");
// Problem: forgot to close the StreamWriter.
}
Der vorangehende Code aktiviert diesen MDA zuverlässiger, wenn eine Garbage Collection ausgelöst und dann angehalten wird, bis finalizer fertig sind. Um diesen Problemtyp nachzuverfolgen, können Sie den folgenden Code am Ende der vorherigen Methode in einem Debugbuild hinzufügen. Dies hilft, die MDA zuverlässig zu aktivieren, aber natürlich wird die Ursache des Problems nicht behoben.
GC.Collect();
GC.WaitForPendingFinalizers();
Resolution
Stellen Sie sicher, dass Sie vor dem StreamWriter Schließen einer Anwendung oder eines Codeblocks, der über eine Instanz einer Anwendung StreamWriterverfügt, oder Flush ein Codeblock aufrufenClose. Einer der besten Mechanismen zum Erreichen dieser Vorgehensweise ist das Erstellen der Instanz mit einem C# using -Block (Using in Visual Basic), wodurch sichergestellt wird, dass die Dispose Methode für den Writer aufgerufen wird, was dazu führt, dass die Instanz ordnungsgemäß geschlossen wird.
using(StreamWriter sw = new StreamWriter("file.txt"))
{
sw.WriteLine("Data");
}
Der folgende Code zeigt die gleiche Lösung anstelle try/finally von using.
StreamWriter sw;
try
{
sw = new StreamWriter("file.txt"));
sw.WriteLine("Data");
}
finally
{
if (sw != null)
sw.Close();
}
Wenn keine dieser Lösungen verwendet werden kann (z. B. wenn eine StreamWriter in einer statischen Variable gespeichert ist und Sie Code nicht einfach am Ende der Lebensdauer ausführen können), sollte das Aufrufen Flush der StreamWriter Eigenschaft nach der letzten Verwendung oder Festlegen der AutoFlush Eigenschaft true vor der ersten Verwendung dieses Problems vermeiden.
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;
}
Effekt auf die Laufzeit
Diese MDA hat keine Auswirkungen auf die Laufzeit.
Output
Eine Meldung, die angibt, dass diese Verletzung aufgetreten ist.
Konfiguration
<mdaConfig>
<assistants>
<streamWriterBufferedDataLost />
</assistants>
</mdaConfig>