首页 >后端开发 >C++ >为什么我不能在 C# 中的 `lock` 语句中使用 `await`?

为什么我不能在 C# 中的 `lock` 语句中使用 `await`?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-15 06:31:46863浏览

Why Can't I Use `await` Inside a `lock` Statement in C#?

理解 C# 限制:awaitlock 语句

Microsoft 的 C# 文档明确禁止在 await 语句中使用 lock 关键字。 这不是编译器限制;而是编译器限制。这是一个经过深思熟虑的设计选择,旨在防止严重的编程错误:死锁。

死锁危险

让我们来看看为什么组合 awaitlock 会出现问题。 考虑规避限制的常见尝试:

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn