【发布时间】:2016-07-01 08:26:28
【问题描述】:
我在新框架中看到了许多方法,这些方法在 C# 中使用对 async/await 的新异步模式/语言支持。为什么没有Monitor.EnterAsync() 或其他async lock 机制释放当前线程并在lock 可用时立即返回?
我认为这是不可能的——问题是为什么?
【问题讨论】:
-
我知道这个关于监视器的问题,但是有一些同步原语确实提供异步操作:msdn.microsoft.com/en-us/library/hh462723.aspx
-
绝对有可能!它只是很难编写(并且更难正确使用),并且它没有被改装到现有的
Monitor类中,因为Monitor是一个相当基本的类型,这是一个相当复杂的案例(假设你真的,真的需要它)。有关实现,请参阅 github.com/StephenCleary/AsyncEx/wiki/AsyncMonitor。 -
可以实现,但是当您尝试并实际使用它时会出错。 stackoverflow.com/questions/7612602/…
-
其他大问题:整个
Monitor.Enter被构建为最快的锁定原语。Task的开销相当大……两者混合得不太好。 -
有这样一种方法,在那种同步对象上,不关心哪个线程拥有锁。忽略这些细节会让你进入带有 async/await 的大狗。使用 SemaphoreSlim.WaitAsync()
标签: c#