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

hej*_*oco 2 .net c# multithreading asynchronous async-await

我有一个非常简单的日志实用程序,当前是同步的.它从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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Yuv*_*kov 5

以下异步方法是否有效?

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

它会与现有的同步方法很好地结合使用吗?它们可以一起使用吗?

如果你的同步方法使用相同的方法SemaphoreSlim并使用同步Wait,它们应该很好地发挥作用.

假设前一个已经解决,那么最终的Debug.WriteLine应该进入try块内部还是最后一个当前位置之后 - 它会有所作为吗?

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