应该弃用 Task.Wait 吗?
Should Task.Wait be deprecated?
我了解到从池线程调用 Task.Wait 会导致线程饥饿死锁的艰难方法。
根据this MSDN article,在'deadlocks'章中,我们应该遵守这两条规则:
- 不要创建任何 class 其同步方法等待异步函数,因为此 class 可以从池中的线程调用。
- 如果 class 块等待异步函数,请不要在异步函数中使用任何 class。
似乎唯一可以合法使用 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 作者仍然需要使这些类型的呼叫成为可能。
我了解到从池线程调用 Task.Wait 会导致线程饥饿死锁的艰难方法。
根据this MSDN article,在'deadlocks'章中,我们应该遵守这两条规则:
- 不要创建任何 class 其同步方法等待异步函数,因为此 class 可以从池中的线程调用。
- 如果 class 块等待异步函数,请不要在异步函数中使用任何 class。
似乎唯一可以合法使用 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 作者仍然需要使这些类型的呼叫成为可能。