理解 C# 限制:await
内 lock
语句
Microsoft 的 C# 文档明确禁止在 await
语句中使用 lock
关键字。 这不是编译器限制;而是编译器限制。这是一个经过深思熟虑的设计选择,旨在防止严重的编程错误:死锁。
死锁危险
让我们来看看为什么组合 await
和 lock
会出现问题。 考虑规避限制的常见尝试:
<code class="language-csharp">using (await Async.Lock(padlock)) { await SomethingAsync(); }</code>
虽然看似无害,但这种方法掩盖了重大风险。 Monitor.Exit
方法中的 ExitDisposable.Dispose
调用可能会无限期地被阻止。 发生这种情况是因为在 await
产生控制权和方法恢复之间可以执行任意代码。 此干预代码可能会获取其他锁,从而可能会颠倒锁获取顺序并触发死锁。
编译器的保护措施
C# 编译器禁止在 await
语句中使用 lock
是一项重要的保障措施。 允许这种组合会显着增加死锁的可能性,这是一个众所周知的难以调试的问题。 该限制可以防止开发人员无意中引入这种危险的并发缺陷。 因此,避免这种组合对于 C# 中健壮且可靠的异步编程至关重要。
以上是为什么我不能在 C# 中的 `lock` 语句中使用 `await`?的详细内容。更多信息请关注PHP中文网其他相关文章!