如何以线程安全的方式从多个线程使用async/await异步写入文件流
本文关键字:线程 await async 异步 文件 安全 方式 | 更新日期: 2023-09-27 18:16:28
我有一个非常简单的日志工具,目前是同步的。它从UI (WPF)和线程池线程(Task.Run)调用,并使用lock(_stream){_stream.WriteLine(message);}
用于线程安全。我想添加一个异步写方法,但不确定如何使其线程安全。
- 下面的异步方法会工作吗?
- 它是否可以很好地与现有的同步方法一起使用,它们是否可以一起使用而不会出现问题?
- 假设前面的解决了,最终的
Debug.WriteLine
应该进入try
块还是在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);
}
}
下面的异步方法会工作吗?
如果流设置正确,那么是的,我看没有理由不
它能与现有的同步方法很好地配合使用吗?它们能一起使用而不会出现问题吗?
如果您的同步方法使用相同的SemaphoreSlim
和同步Wait
,它们应该可以很好地配合。
假设前面的问题解决了,应该执行最后的Debug。WriteLine进入try块内或在finally之后,它当前所在的位置-它有区别吗?
如果当且仅当流成功地将消息写入流时应该写入调试消息,则该消息应该在try
块中,在调用WriteLineAsync
之后。