我了解到从池线程调用 Task.Wait 会导致线程饥饿死锁的艰难方法。
根据 this MSDN article ,在“死锁”一章中,我们应该遵守这两条规则:
- 不要创建任何其同步方法等待异步函数的类,因为此类可以从池中的线程调用。
- 如果类阻塞等待异步函数,则不要在异步函数内使用任何类。
似乎唯一可以合法使用 Task.Wait 的地方是 Main 函数 - 我在这里有点夸张,但你明白了。
为什么 Task.Wait 仍然是 .NET 框架的一部分,看看它有多危险?
最佳答案
Why is Task.Wait still part of the .NET framework, seeing how dangerous it is?
因为您希望能够在 Task
上同步阻塞。很少,但你仍然这样做。正如您所说,Main
可能是最流行(最好是唯一)会发生这种情况的地方。那个,以及微软因其向后兼容性而臭名昭着的事实,所以一旦引入它,它就极不可能被弃用或从 BCL 中消失。 Task.WaitAll
也是如此。
真正的问题 当人们没有正确阅读文档并且不理解调用此类方法的含义并最终滥用它时,IMO 就开始了。如果您小心使用它,它的效果会很好。
另一件事是您不能总是一路异步。不幸的是,很多时候您的代码是通过签名同步的,无法更改并且需要调用异步方法。是的,这是危险的,所有人都不鼓励,被认为是 anti-pattern with async code ,我自己已经回答了至少十几个关于 SO 的问题,人们最终陷入僵局并且不明白为什么,但 TPL 作者仍然需要使这些类型的调用成为可能。
关于c# - Task.Wait 应该被弃用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33351092/