hej*_*oco 2 .net c# multithreading asynchronous async-await
我有一个非常简单的日志实用程序,当前是同步的.它从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);
}
}
Run Code Online (Sandbox Code Playgroud)
以下异步方法是否有效?
如果流设置正确,那么是的,我认为没有理由不这样做
它会与现有的同步方法很好地结合使用吗?它们可以一起使用吗?
如果你的同步方法使用相同的方法SemaphoreSlim并使用同步Wait,它们应该很好地发挥作用.
假设前一个已经解决,那么最终的Debug.WriteLine应该进入try块内部还是最后一个当前位置之后 - 它会有所作为吗?
如果当且仅当流成功地将消息写入流时应该写入调试消息,则try在调用之后它应该在块内WriteLineAsync.