当SynchronizationContext.Current为null时,我可以安全地使用Task.Wait吗?

时间:2016-12-12 20:15:17

标签: c# .net async-await task deadlock

当SynchronizationContext.Current为null时,为什么调用Task.Wait()和Task.Result不是100%安全?

我有一个多线程但同步的服务。我正在通过调用HttpClient.PostAsXmlAsync来替换其中一个同步方法。该实现使用.Result将其转换为同步方法,以避免更改整个项目。但是,我们正在获得有据可查的典型死锁问题。

如果没有同步上下文,我不明白如何出现死锁。

2 个答案:

答案 0 :(得分:0)

如果没有同步上下文,则不会发生异步代码上的typical problems with blocking。但是,它不是100%安全:如果线程属于线程池,阻塞将使线程不会返回池,这可能导致线程池线程用完。

在我的情况下,问题实际上是由我们的公司代理服务器引起的。如果有足够的时间,线程确实会回来。我改变了我的代码,用HttpClient传递了一个带有UseProxy = false的HttpClientHandler,问题就消失了。

答案 1 :(得分:-1)

方法HttpClient.PostAsXmlAsync是在后台执行HttpClient.SendAsync的扩展方法。 SendAsync方法是异步方法 所以你在"同步"中调用异步方法方式 - 这会导致你自己注意到的非常明显的僵局。

  

...将其转换为同步方法,以避免更改   整个项目

为避免将整个应用程序管道更改为async - 请勿使用async async-await是一种僵尸病毒,当你开始使用它时会遍布你的应用程序:)