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

我有多个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}");

    }

}


紫衣仙女
浏览 100回答 3
3回答

富国沪深

真正回答你的问题。不,它不会使您免于锁定问题。async 不是一个可以同步所有线程的神奇关键字。相反,它甚至可能根据同步器启动自己的线程。除非您在单线程模型上,否则是的,这将排队,因为同步器只有一个线程可以使用。然后它必须通过上下文切换将所有异步调用排队。但是,如果您使用的是单线程模型,那么您一开始就不会遇到这个问题。

眼眸繁星

您可以通过多种方式解决问题。使用锁定机制来同步对共享资源的访问。对于这种情况,一个不错的选择是 ReaderWriterLockSlim使用日志框架(有很多好的库并且非常可靠)。就我个人而言,我更喜欢使用日志记录框架,因为您将使用许多有用的功能(滚动文件附加程序、数据库记录器等),它们将为您提供一个干净的解决方案,用于零黑客和维护的日志记录。

子衿沉夜

虽然使用日志框架是最好的解决方案,但专门解决这个问题......附加模式需要锁定文件,当无法获得锁定时,您会收到收到的错误。你可以同步所有线程,但你会阻塞它们一段时间。使用WriteAsync并不能缓解问题。更好的解决方案是将您的消息排入队列,然后有一个专用线程将它们出列并写入日志。因此,您不需要同步,因为所有写入都由单个线程完成。我会再次警告:使用日志框架。
打开App,查看更多内容
随时随地看视频慕课网APP