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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-15 11:12:45375浏览

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

C# 中lock语句内禁止使用await的原因

在 C# 中,await 运算符不能在 lock 语句内使用,这是编译器团队刻意做出的设计选择。虽然实现此功能并非难事,但它被认为是一种危险的做法,容易导致死锁。

限制背后的原因

lock 语句中允许使用 await 会导致在 await 释放控制权和方法随后恢复之间执行任意代码。此代码可能会以与原始锁层次结构冲突的顺序获取锁,从而导致死锁。

此外,await 可能会在与最初获取锁的线程不同的线程上恢复执行。这会导致在与获取锁的线程不同的线程上解锁锁的可能性,这是非常不希望的。

对自定义锁实现的影响

尝试使用自定义锁实现(例如给定代码示例中提供的实现)来规避此限制可能会导致不可预测且可能容易出现死锁的行为。这是因为,如果在 await 操作进行时另一个线程获取了锁,则 ExitDisposable 类中的 Monitor.Exit 调用可能会无限期阻塞。

结论

虽然 await 运算符提供了强大的异步编程功能,但必须了解遵循推荐的最佳实践(包括禁止在 lock 语句中使用 await)的重要性。此限制旨在防止死锁,并确保多线程代码的安全性和可靠性。

以上是为什么不能在 C# 中的 `lock` 语句中使用 `await`?的详细内容。更多信息请关注PHP中文网其他相关文章!

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