Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在将日志刷新到磁盘,VerifyOSHandlePosition中出现异常_C#_.net_Logging_Filestream_Flush - Fatal编程技术网

C# 正在将日志刷新到磁盘,VerifyOSHandlePosition中出现异常

C# 正在将日志刷新到磁盘,VerifyOSHandlePosition中出现异常,c#,.net,logging,filestream,flush,C#,.net,Logging,Filestream,Flush,如何从C#服务写入日志文件,以便及时将其刷新到磁盘 这是我试过的。在日志代码中,我打开了如下文件: var file = return File.Open(name, FileMode.Append, FileAccess.Write, FileShare.Read); var writer = new StreamWriter(file); writer.WriteLine(msg); writer.Flush(); file.Flu

如何从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();
写了这样一封信:

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());
这似乎有效,但偶尔会出现以下异常:

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()
有没有更好的方法来强制刷新?

Per,在.NET 4.0下,只需调用

file.Flush(true)
不再需要在p/Invoke调用中胡闹。

MS错误报告说file.Flush(true)已损坏,然后已修复,但没有说明修复该文件的版本或service pack!听起来这个bug是因为如果内部.NET FileStream缓冲区为空,则刷新(true)什么也没做??