刷新日志到磁盘,在VerifyOSHandlePosition中例外

如何从C#服务编写日志文件,以便及时刷新到磁盘?

这是我尝试过的。 在记录代码中,我打开了一个这样的文件:

var file = return File.Open(name, FileMode.Append, FileAccess.Write, FileShare.Read); var writer = new StreamWriter(file); 

并写信给它:

 writer.WriteLine(msg); writer.Flush(); file.Flush(); 

但是,日志未及时刷新到磁盘。 所以我尝试添加一个5秒计时器,这样做:

 [DllImport("kernel32.dll")] static extern bool FlushFileBuffers(IntPtr hFile); file.Flush(); var hdl = file.SafeFileHandle; FlushFileBuffers(hdl.DangerousGetHandle()); 

这似乎有效,但在不经常的时间间隔我得到以下exception:

 System.IO.IOException: The OS handle's position is not what FileStream expected. Do not use a handle simultaneously in one FileStream and in Win32 code or another FileStream. This may cause data loss. at System.IO.FileStream.VerifyOSHandlePosition() 

有没有更好的方法来强制冲洗?

根据这个答案 ,在.NET 4.0下只需调用即可

 file.Flush(true) 

不再需要使用p / Invoke调用。