我正在寻找同步任务的最佳实践(甚至不确定这在语义上是否正确,我可能应该说用异步代码同步线程)。
采取以下代码:
Task.Run(async () => await lib.WaitAsync());
Task.Run(async () => await lib.WaitAsync());
Task.Run(async () => await lib.WaitAsync());
// Synchronize all waiters
lib.Release();
// All Tasks shall be completed
Run Code Online (Sandbox Code Playgroud)
在使用线程时,我曾经使用ManualResetEvent. 所以我的第一个(简化的)方法是:
Task WaitAsync()
{
await Task.Run(() => manualResetEvent.WaitOne());
}
void Release()
{
manualResetEvent.Set();
}
Run Code Online (Sandbox Code Playgroud)
现在我看到人们已经实现了自己的 async ManualResetEvent。
原始方法有什么问题以及为什么有人更喜欢异步实现?是因为取消了吗?异常展开/处理?
更一般地说,在异步代码中使用常规线程同步对象(互斥量、信号量等)是否有任何缺点?
谢谢