gpt4 book ai didi

c# - 如何以线程安全的方式使用多线程的 async/await 异步写入文件流

转载 作者:行者123 更新时间:2023-12-01 19:44:15 26 4
gpt4 key购买 nike

我有一个非常简单的日志记录实用程序,当前是同步的。它从 UI (WPF) 和线程池线程 (Task.Run) 调用并使用 lock(_stream){_stream.WriteLine(message);}为了线程安全。我想添加一个异步写入方法,但不确定如何使其线程安全。

  1. 以下异步方法可以工作吗?
  2. 它能与现有的同步方法很好地配合吗?它们可以毫无问题地一起使用吗?
  3. 假设前面的问题已经解决,那么最终的结果应该是 Debug.WriteLine进入try block 或 finally 之后它目前在哪里 - 有什么影响吗?
private static SemaphoreSlim _sync = new SemaphoreSlim(1);    

public static async Task WriteLineAsync(string message)
{
if (_stream != null)
{
await _sync.WaitAsync();

try
{
await _stream.WriteLineAsync(string.Format("{0} {1}", DateTime.Now.ToString("HH:mm:ss.fff") + message));
}
catch(Exception ex)
{
Debug.WriteLine(ex.ToString());
}
finally
{
_sync.Release();
}

Debug.WriteLine("{0} {1}", DateTime.Now.ToString("HH:mm:ss.fff"), message);
}
}

最佳答案

Will the following async method work?

如果流设置正确,那么是的,我认为没有理由不这样做

Will it play nice with the existing synchronous method and can they be used together without issues?

如果您的同步方法使用相同的 SemaphoreSlim 并使用同步 Wait,它们应该可以很好地配合。

Assuming the previous is resolved, should the final Debug.WriteLine go inside the try block or after the finally where it currently is - does it make a difference?

如果当且仅当流成功地将消息写入流时才应写入调试消息,则它应该位于调用 WriteLineAsync 之后的 try block 内>.

关于c# - 如何以线程安全的方式使用多线程的 async/await 异步写入文件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com