当SynchronizationContext.Current为null时,为什么调用Task.Wait()和Task.Result不是100%安全?
我有一个多线程但同步的服务。我正在通过调用HttpClient.PostAsXmlAsync来替换其中一个同步方法。该实现使用.Result将其转换为同步方法,以避免更改整个项目。但是,我们正在获得有据可查的典型死锁问题。
如果没有同步上下文,我不明白如何出现死锁。
答案 0 :(得分:0)
如果没有同步上下文,则不会发生异步代码上的typical problems with blocking。但是,它不是100%安全:如果线程属于线程池,阻塞将使线程不会返回池,这可能导致线程池线程用完。
在我的情况下,问题实际上是由我们的公司代理服务器引起的。如果有足够的时间,线程确实会回来。我改变了我的代码,用HttpClient传递了一个带有UseProxy = false的HttpClientHandler,问题就消失了。
答案 1 :(得分:-1)
方法HttpClient.PostAsXmlAsync
是在后台执行HttpClient.SendAsync
的扩展方法。 SendAsync
方法是异步方法
所以你在"同步"中调用异步方法方式 - 这会导致你自己注意到的非常明显的僵局。
...将其转换为同步方法,以避免更改 整个项目
为避免将整个应用程序管道更改为async
- 请勿使用async
async-await
是一种僵尸病毒,当你开始使用它时会遍布你的应用程序:)