应该弃用Task.Wait吗?

Zun*_*Tzu 5 .net c# asynchronous task-parallel-library async-await

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

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

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

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

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

Yuv*_*kov 5

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

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

真正的问题 IMO开始时人们不正确读取文档和不理解调用该方法的影响,并最终误用.如果你仔细使用它,它的工作就很棒了.


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

  • 我不同意人们在特定情况下没有正确阅读文档.绝大多数文档都是误导性的,让人们相信调用Task.Wait,Task.Result或其他太多不同的方式来自己射击是没有错的. (2认同)