应该弃用 Task.Wait
本文关键字:Task Wait | 更新日期: 2023-09-27 18:19:22
我学到了从池线程调用 Task.Wait 会导致线程匮乏死锁的艰难方法。
根据这篇 MSDN 文章,在"死锁"一章中,我们应该遵守以下两个规则:
- 不要创建其同步方法等待异步函数的任何类,因为可以从池上的线程调用此类。
- 如果异步函数中的类块等待异步函数,则不要在异步函数中使用任何类。
似乎唯一可以合法使用 Task.Wait 的地方是 Main 函数 - 我在这里有点夸张,但你明白了。
为什么Task.Wait仍然是.NET框架的一部分,看看它有多危险?
为什么 Task.Wait 仍然是 .NET 框架的一部分,看看如何 危险吗?
因为您希望能够在Task
上同步阻止。很少,但你仍然这样做。正如你所说,Main
可能是最受欢迎(最好是唯一(发生这种情况的地方。这一点,以及Microsoft因其向后兼容性而臭名昭著的事实,因此一旦引入此功能,它就极不可能被弃用或从 BCL 中消失。Task.WaitAll
也是如此。
当人们没有正确阅读文档并且不理解调用这种方法的含义并最终滥用它时,IMO 的真正问题就开始了。如果你小心使用它,它的工作很棒。
另一件事是,你不能总是一直异步。遗憾的是,很多时候您有通过签名同步的代码,这些代码无法更改,需要调用异步方法调用。是的,这是危险的,所有人都不鼓励这样做,并且被认为是带有异步代码的反模式,我自己已经回答了至少十几个关于SO的问题,人们最终陷入僵局并且不明白为什么,但是TPL作者仍然需要使这些类型的调用成为可能。