我有多个backgroundworkers都想写入 log.txt,这会导致异常The process cannot access the file 'C:\...\log.txt' because it is being used by another process.。我知道这是一个很长的镜头,但如果我使用它会有所帮助WriteAsync()还是根本没有效果?(如果这不是一个简单的解决方案,我想我必须实现mutex我以前见过的对象。)public static void WriteToLog(string text, bool append = true){ try { using (var writer = new StreamWriter("log.txt", append)) { writer.Write(text); // writer.WriteAsync(text); // Would this 'queue up' instead of trying to access the same process at the same time? } } catch (Exception ex) { Console.WriteLine($"ERROR! Fejl i loggen! {ex.Message}. {ex.StackTrace}"); }}
3 回答
富国沪深
TA贡献1790条经验 获得超9个赞
真正回答你的问题。不,它不会使您免于锁定问题。async 不是一个可以同步所有线程的神奇关键字。相反,它甚至可能根据同步器启动自己的线程。
除非您在单线程模型上,否则是的,这将排队,因为同步器只有一个线程可以使用。然后它必须通过上下文切换将所有异步调用排队。但是,如果您使用的是单线程模型,那么您一开始就不会遇到这个问题。
眼眸繁星
TA贡献1873条经验 获得超9个赞
您可以通过多种方式解决问题。
使用锁定机制来同步对共享资源的访问。对于这种情况,一个不错的选择是 ReaderWriterLockSlim
使用日志框架(有很多好的库并且非常可靠)。
就我个人而言,我更喜欢使用日志记录框架,因为您将使用许多有用的功能(滚动文件附加程序、数据库记录器等),它们将为您提供一个干净的解决方案,用于零黑客和维护的日志记录。
子衿沉夜
TA贡献1828条经验 获得超3个赞
虽然使用日志框架是最好的解决方案,但专门解决这个问题......
附加模式需要锁定文件,当无法获得锁定时,您会收到收到的错误。你可以同步所有线程,但你会阻塞它们一段时间。使用WriteAsync
并不能缓解问题。
更好的解决方案是将您的消息排入队列,然后有一个专用线程将它们出列并写入日志。因此,您不需要同步,因为所有写入都由单个线程完成。
我会再次警告:使用日志框架。
- 3 回答
- 0 关注
- 117 浏览
添加回答
举报
0/150
提交
取消