c# - 尝试写入 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;
}
为什么我会得到这个异常?它是在哪里创建的?
解决方案
它似乎StreamWriter
不是线程安全的。我正在使用上面的日志记录任务从不同的线程记录到同一个文件中。
要解决此问题,请在StreamWriter
其周围创建一个同步包装器:
_writer = TextWriter.Synchronized(new StreamWriter(fileName, true, Encoding.UTF8));
推荐阅读
- ios - 如何在 App Store 的语言部分为我的应用显示法语?
- php - 找不到类?
- ios - 单击集合视图单元格时,UITapGestureRecognizer 崩溃应用程序
- python - Django groupby day 用 0 填充缺失的数据
- php - file_get_content 是否可以进行注入攻击?
- python - Python 多处理无法与fuzzywuzzy 一起按预期工作
- java - JTextField 中的异常处理
- google-analytics - UTM 参数如何到达 Google 分析网站
- c++ - 如何使用 SFINAE 停用我的“Pow(T)”的非集成版本?
- node.js - Nestjs websocket网关,如何从握手中解析签名cookie以进行保护授权?