ArgumentOutOfRangeException当试图写到TextWriter/StreamWriter



当在TextWriter实例上调用Write时,我得到了这个奇怪的异常:


Unhandled exception. System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
at System.IO.FileStream.FlushWriteBuffer()
at System.IO.FileStream.WriteSpan(ReadOnlySpan`1 source)
at System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.WriteLine(String value)
at Iot.Device.Common.SimpleFileLogger.Log[TState](LogLevel logLevel, EventId eventId, TState state, Exception exception, Func`3 formatter) in C:ProjectsiotsrcdevicesCommonIotDeviceCommonSimpleFileLogger.cs:line 49
// More irrelevant stuff here...   

所讨论的行只是这样做(作者肯定没有被处理或关闭):

// _writer is an instance of StreamWriter
_writer.WriteLine($"{time.ToShortDateString()} {time.ToLongTimeString()} - {_category} - {logLevel} - {msg}");

根据文档,TextWriter.WriteLine从不抛出ArgumentOutOfRangeException,甚至查看FlushWriteBuffer方法的源代码也没有显示任何可能导致此(我使用。net 5.0):

private void FlushWriteBuffer(bool calledFromFinalizer = false)
{
if (_writePos == 0) return;
Debug.Assert(_readPos == 0 && _readLength == 0, "FileStream: Read buffer must be empty in FlushWrite!");
if (_useAsyncIO)
{
// Irrelevant case
}
else
{
WriteCore(new ReadOnlySpan<byte>(GetBuffer(), 0, _writePos));
}
_writePos = 0;
}

为什么我得到这个异常?它是在哪里产生的?

看来StreamWriter不是线程安全的。我正在使用上面的日志任务从不同的线程记录到同一个文件。

要解决这个问题,创建StreamWriter,并在其周围使用同步包装器:

_writer = TextWriter.Synchronized(new StreamWriter(fileName, true, Encoding.UTF8));

相关内容

最新更新