为了账号安全,请及时绑定邮箱和手机立即绑定

如果我使用 WriteAsync,当多个后台工作人员尝试写入同一个 .txt 文件时

如果我使用 WriteAsync,当多个后台工作人员尝试写入同一个 .txt 文件时

C#
紫衣仙女 2022-10-23 16:07:03
我有多个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 不是一个可以同步所有线程的神奇关键字。相反,它甚至可能根据同步器启动自己的线程。

除非您在单线程模型上,否则是的,这将排队,因为同步器只有一个线程可以使用。然后它必须通过上下文切换将所有异步调用排队。但是,如果您使用的是单线程模型,那么您一开始就不会遇到这个问题。


查看完整回答
反对 回复 2022-10-23
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

您可以通过多种方式解决问题。

  1. 使用锁定机制来同步对共享资源的访问。对于这种情况,一个不错的选择是 ReaderWriterLockSlim

  2. 使用日志框架(有很多好的库并且非常可靠)。

就我个人而言,我更喜欢使用日志记录框架,因为您将使用许多有用的功能(滚动文件附加程序、数据库记录器等),它们将为您提供一个干净的解决方案,用于零黑客和维护的日志记录。


查看完整回答
反对 回复 2022-10-23
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

虽然使用日志框架是最好的解决方案,但专门解决这个问题......

附加模式需要锁定文件,当无法获得锁定时,您会收到收到的错误。你可以同步所有线程,但你会阻塞它们一段时间。使用WriteAsync并不能缓解问题。

更好的解决方案是将您的消息排入队列,然后有一个专用线程将它们出列并写入日志。因此,您不需要同步,因为所有写入都由单个线程完成。

我会再次警告:使用日志框架。


查看完整回答
反对 回复 2022-10-23
  • 3 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信