2016-12-12 93 views
0

爲什麼在SynchronizationContext.Current爲空時調用Task.Wait()和Task.Result並非100%安全?當SynchronizationContext.Current爲空時,我可以安全地使用Task.Wait嗎?

我有一個多線程但同步的服務。我正在用對HttpClient.PostAsXmlAsync的調用替換其中一個同步方法。該實現使用.Result將其轉換爲同步方法,以避免更改整個項目。但是,我們正在獲得有據可查的典型死鎖問題。

我不明白如果沒有同步上下文會出現死鎖。

+0

也許你可以發表至少一些代碼。通過服務你的意思是Windows服務? – Evk

+0

@Evk - 他可能意味着一個web服務 – Zegar

+0

爲什麼你首先使用異步方法,如果你只是要等待他們完成?如果要執行同步操作,只需從一開始就使用固有的同步方法。如果你只是要等待它們,沒有任何目的*可以使一些方法異步。要麼是這樣,要麼只是使服務處理程序異步。 – Servy

回答

-1

方法HttpClient.PostAsXmlAsync是在後臺執行HttpClient.SendAsync的擴展方法。 SendAsync方法是異步方法。
所以你以「同步」的方式調用異步方法 - 如你自己注意到的那樣會導致非常嚴重的死鎖問題。

...來轉換成同步的方法,以避免改變 整個項目

爲了避免改變整個應用程序管道async - 不要使用async
async-await是殭屍病毒,遍佈你的應用程序時,你開始使用它:)

+0

你是什麼意思「創建同步上下文的方法」。我相信呼籲等待*捕捉上下文。我不知道SendAsync或等待*創建*同步上下文。 –

0

如果沒有同步背景下,異步代碼typical problems with blocking不會發生。但是,它不是100%安全的:如果線程屬於線程池,阻塞會阻止線程返回到池,這會導致線程池線程用完。

在我的情況下,問題實際上是由我們的公司代理服務器引起的。如果有足夠的時間,線程確實會回來。我改變了我的代碼,將UseProxy = false傳遞給HttpClient和一個HttpClientHandler,問題就消失了。

相關問題