繁体   English   中英

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

[英]Can I safely use Task.Wait when SynchronizationContext.Current is null?

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

我有一个多线程但同步的服务。 我用对HttpClient.PostAsXmlAsync的调用替换了同步方法之一。 该实现使用.Result将其转换为同步方法,以避免更改整个项目。 但是,我们得到了典型的死锁问题,这些问题已得到充分记录。

我不明白如果没有同步上下文,怎么会有死锁。

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

就我而言,问题实际上是由我们的公司代理服务器引起的。 如果有足够的时间,线程确实会返回。 我更改了代码,以将HttpClient和UseProxy = false传递给HttpClientHandler,问题就消失了。

方法HttpClient.PostAsXmlAsync是在后台执行HttpClient.SendAsync扩展方法。 SendAsync方法是异步方法。
因此,您以“同步”方式调用异步方法-正如您自己所注意到的那样,这导致记录在案的死锁。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM