”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么在C#中的`锁语句中都禁止``等待''?

为什么在C#中的`锁语句中都禁止``等待''?

发布于2025-03-04
浏览:194

[2

理解限制:Why is `await` Prohibited Inside a `lock` Statement in C#?

c#'s

锁定语句中的内部。此限制是预防常见错误来源的关键设计选择:僵局。 Microsoft的文档解释说, lock 中的表达式会产生风险。 代码的执行可以在等待后暂停,从而产生控制,以后在潜在的不同线程上恢复。此正时差距可能导致其他线程获得锁,逆转锁定顺序并导致死锁的情况。

让我们检查一个假设的例子: 类async { 公共静态异步任务锁(Object OBJ) { while(!monitor.tryenter(obj)) 等待任务yield(); 返回新的出口(OBJ); } 私人班级exitdisposable:idisposable { 私人阅读对象obj; public exitdisposable(object obj){this.obj = obj; } public void dispose(){monitor.exit(this.obj); } } } 此代码试图模仿异步锁定,但是正如编译器所指出的那样,它很容易在[

exitdisposable.dispose()

内无限期阻止。 发生这种情况是因为[可能会在与获取锁(可能违反锁定订单的锁定的线程)上执行。 本质上,的禁令是避免多线程应用程序中的死锁的主动措施。 最好避免将异步操作与语句相结合,并考虑从[[&&&&&&&threading [&& && && && && && && princterives诸如reader-writer locks或同步pientives)等替代同步方法。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3