Сброс журнала на диск, исключение в 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());
Кажется, это работает, но через редкие интервалы я получаю следующее исключение:
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()
Есть ли лучший способ вызвать флеш?