Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
Nota:
Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.
El streamWriterBufferedDataLost asistente de depuración administrada (MDA) se activa cuando se escribe en StreamWriter , pero el Flush método o Close no se llama posteriormente antes de que se destruya la instancia de StreamWriter . Cuando se habilita este MDA, el tiempo de ejecución determina si los datos almacenados en búfer siguen existiendo dentro de StreamWriter. Si existen datos almacenados en búfer, se activa el MDA. Llamar a los Collect métodos y WaitForPendingFinalizers puede forzar la ejecución de finalizadores. Los finalizadores se ejecutarán en momentos aparentemente arbitrarios y, posiblemente, no en absoluto en la salida del proceso. La ejecución explícita de finalizadores con este MDA habilitado ayudará a reproducir este tipo de problema de forma más confiable.
Síntomas
Un StreamWriter no escribe los últimos 1 a 4 KB de datos en un archivo.
Causa
Almacena StreamWriter en búfer los datos internamente, lo que requiere que Close se llame al método o Flush para escribir los datos almacenados en búfer en el almacén de datos subyacente. Si Close se llama a o Flush no se llama adecuadamente, es posible que los datos almacenados en búfer en la StreamWriter instancia no se escriban según lo previsto.
A continuación se muestra un ejemplo de código mal escrito que este MDA debe detectar.
// Poorly written code.
void Write()
{
StreamWriter sw = new StreamWriter("file.txt");
sw.WriteLine("Data");
// Problem: forgot to close the StreamWriter.
}
El código anterior activará este MDA de forma más confiable si se desencadena una recolección de elementos no utilizados y, a continuación, se suspende hasta que finalicen los finalizadores. Para realizar un seguimiento de este tipo de problema, puede agregar el código siguiente al final del método anterior en una compilación de depuración. Esto ayudará a activar de forma confiable el MDA, pero, por supuesto, no corrige la causa del problema.
GC.Collect();
GC.WaitForPendingFinalizers();
Resolution
Asegúrese de llamar a Close o Flush en antes StreamWriter de cerrar una aplicación o cualquier bloque de código que tenga una instancia de .StreamWriter Uno de los mejores mecanismos para lograr esto es crear la instancia con un bloque de C# using (Using en Visual Basic), que garantizará que se invoque el Dispose método para el escritor, lo que hará que la instancia se cierre correctamente.
using(StreamWriter sw = new StreamWriter("file.txt"))
{
sw.WriteLine("Data");
}
El código siguiente muestra la misma solución, usando try/finally en lugar de using.
StreamWriter sw;
try
{
sw = new StreamWriter("file.txt"));
sw.WriteLine("Data");
}
finally
{
if (sw != null)
sw.Close();
}
Si ninguna de estas soluciones se puede usar (por ejemplo, si un StreamWriter se almacena en una variable estática y no se puede ejecutar fácilmente código al final de su duración), después de llamar FlushStreamWriter a en después de su último uso o establecer la AutoFlush propiedad en true antes de su primer uso debe evitar este problema.
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;
}
Efecto en el tiempo de ejecución
Este MDA no tiene ningún efecto en el tiempo de ejecución.
Salida
Mensaje que indica que se produjo esta infracción.
Configuración
<mdaConfig>
<assistants>
<streamWriterBufferedDataLost />
</assistants>
</mdaConfig>