首页 > 解决方案 > 尝试写入 TextWriter/StreamWriter 时出现 ArgumentOutOfRangeException

问题描述

调用实例时Write出现了这个奇怪的异常:TextWriter


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:\Projects\iot\src\devices\Common\Iot\Device\Common\SimpleFileLogger.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;
        }

为什么我会得到这个异常?它是在哪里创建的?

标签: c#.net-corefile-io

解决方案


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

要解决此问题,请在StreamWriter其周围创建一个同步包装器:

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

推荐阅读