메모
이 문서는 .NET Framework와 관련이 있습니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.
streamWriterBufferedDataLost MDA(관리 디버깅 도우미)는 기록될 때 StreamWriter 활성화되지만 Flush 이후에 인스턴스가 제거되기 전에 StreamWriter 또는 Close 메서드가 호출되지 않습니다. 이 MDA를 사용하도록 설정하면 런타임은 버퍼링된 데이터가 여전히 에 StreamWriter있는지 여부를 결정합니다. 버퍼링된 데이터가 있는 경우 MDA가 활성화됩니다. 및 WaitForPendingFinalizers 메서드를 Collect 호출하면 종료자가 강제로 실행됩니다. 그렇지 않으면 종료자가 임의의 시간에 실행되고 프로세스 종료 시 전혀 실행되지 않을 수 있습니다. 이 MDA를 사용하도록 설정된 종료자를 명시적으로 실행하면 이러한 유형의 문제를 보다 안정적으로 재현하는 데 도움이 됩니다.
Symptoms
A StreamWriter 는 마지막 1~4KB의 데이터를 파일에 쓰지 않습니다.
원인
StreamWriter 내부적으로 데이터를 버퍼링합니다. 이 Close 경우 버퍼링된 데이터를 기본 데이터 저장소에 쓰려면 메서드 Flush 를 호출해야 합니다. Close 적절하게 호출되거나 Flush 호출되지 않으면 인스턴스에서 StreamWriter 버퍼링된 데이터가 예상대로 작성되지 않을 수 있습니다.
다음은 이 MDA가 catch해야 하는 잘못 작성된 코드의 예입니다.
// Poorly written code.
void Write()
{
StreamWriter sw = new StreamWriter("file.txt");
sw.WriteLine("Data");
// Problem: forgot to close the StreamWriter.
}
위의 코드는 가비지 수집이 트리거된 다음 종료자가 완료될 때까지 일시 중단되는 경우 이 MDA를 보다 안정적으로 활성화합니다. 이러한 유형의 문제를 추적하려면 디버그 빌드에서 이전 메서드의 끝에 다음 코드를 추가할 수 있습니다. 이렇게 하면 MDA를 안정적으로 활성화하는 데 도움이 되지만 문제의 원인을 해결하지는 못합니다.
GC.Collect();
GC.WaitForPendingFinalizers();
해결 방법
애플리케이션 또는 인스턴스가 StreamWriter 있는 코드 블록을 닫기 전에 호출 Close 하거나 Flush 호출해야 합니다StreamWriter. 이를 달성하기 위한 가장 좋은 메커니즘 중 하나는 작성기에 대한 메서드가 호출되어 Dispose 인스턴스가 올바르게 닫히는 C# using 블록(UsingVisual Basic)을 사용하여 인스턴스를 만드는 것입니다.
using(StreamWriter sw = new StreamWriter("file.txt"))
{
sw.WriteLine("Data");
}
다음 코드에서는 try/finallyusing.
StreamWriter sw;
try
{
sw = new StreamWriter("file.txt"));
sw.WriteLine("Data");
}
finally
{
if (sw != null)
sw.Close();
}
이러한 솔루션을 둘 다 사용할 수 없는 경우(예: 정적 변수에 저장되어 있고 수명이 끝날 때 코드를 쉽게 실행할 수 없는 경우StreamWriter) 마지막 사용 후를 호출 StreamWriterFlush 하거나 속성을 처음 사용하기 전으로 true 설정 AutoFlush 하면 이 문제를 방지할 수 있습니다.
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;
}
런타임에 미치는 영향
이 MDA는 런타임에 영향을 주지 않습니다.
출력
이 위반이 발생했음을 나타내는 메시지입니다.
Configuration
<mdaConfig>
<assistants>
<streamWriterBufferedDataLost />
</assistants>
</mdaConfig>
참고하십시오
.NET