C# 中lock
语句内禁止使用await
的原因
在 C# 中,await
运算符不能在 lock
语句内使用,这是编译器团队刻意做出的设计选择。虽然实现此功能并非难事,但它被认为是一种危险的做法,容易导致死锁。
限制背后的原因
在 lock
语句中允许使用 await
会导致在 await
释放控制权和方法随后恢复之间执行任意代码。此代码可能会以与原始锁层次结构冲突的顺序获取锁,从而导致死锁。
此外,await
可能会在与最初获取锁的线程不同的线程上恢复执行。这会导致在与获取锁的线程不同的线程上解锁锁的可能性,这是非常不希望的。
对自定义锁实现的影响
尝试使用自定义锁实现(例如给定代码示例中提供的实现)来规避此限制可能会导致不可预测且可能容易出现死锁的行为。这是因为,如果在 await
操作进行时另一个线程获取了锁,则 ExitDisposable
类中的 Monitor.Exit
调用可能会无限期阻塞。
结论
虽然 await
运算符提供了强大的异步编程功能,但必须了解遵循推荐的最佳实践(包括禁止在 lock
语句中使用 await
)的重要性。此限制旨在防止死锁,并确保多线程代码的安全性和可靠性。
以上是为什么不能在 C# 中的 `lock` 语句中使用 `await`?的详细内容。更多信息请关注PHP中文网其他相关文章!