应该弃用Task.Wait吗?

我学到了从池线程调用Task.Wait会导致线程饥饿死锁的困难方法。

根据这篇MSDN文章 ,在“死锁”一章中,我们应遵守这两条规则:

  • 不要创建任何同步方法等待异步函数的类,因为可以从池中的线程调用此类。
  • 如果类阻塞等待异步函数,则不要在异步函数内使用任何类。

似乎唯一合法使用Task.Wait的地方是主要function – 我在这里夸大了一点,但你明白了。

为什么Task.Wait仍然是.NET框架的一部分,看它有多危险?

为什么Task.Wait仍然是.NET框架的一部分,看它有多危险?

因为您希望能够同步阻止Task 。 很少,但你仍然这样做。 正如你所说, Main可能是最受欢迎(最好是唯一)的地方。 这一点,以及微软因其向后兼容性而臭名昭着的事实,因此一旦引入,它就不太可能被弃用或从BCL中消失。 Task.WaitAll

当人们没有正确阅读文档并且不理解调用这种方法并最终滥用它的含义时,IMO就会出现真正的问题 。 如果你仔细使用它,它的工作就很棒。


另一件事是你不能总是一直异步 。 不幸的是,很多时候你有代码,它是签名同步的,不能改变,需要调用异步方法调用。 是的,这是危险的,并且被所有人劝阻,并被认为是具有异步代码的反模式 ,我自己已经回答了至少十二个关于SO的问题,人们最终陷入僵局并且不明白为什么,但TPL作者仍然需要使这些类型的调用成为可能。