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

本文关键字:线程 await async 异步 文件 安全 方式 | 更新日期: 2023-09-27 18:16:28

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

  1. 下面的异步方法会工作吗?
  2. 它是否可以很好地与现有的同步方法一起使用,它们是否可以一起使用而不会出现问题?
  3. 假设前面的解决了,最终的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);
    }
}

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

下面的异步方法会工作吗?

如果流设置正确,那么是的,我看没有理由不

它能与现有的同步方法很好地配合使用吗?它们能一起使用而不会出现问题吗?

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

假设前面的问题解决了,应该执行最后的Debug。WriteLine进入try块内或在finally之后,它当前所在的位置-它有区别吗?

如果当且仅当流成功地将消息写入流时应该写入调试消息,则该消息应该在try块中,在调用WriteLineAsync之后。