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

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

Mary-Kate Olsen
发布: 2025-01-15 06:31:46
原创
805 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板