2016-01-25 84 views
0

從ASP.NET應用程序只需調用時掛在下面的代碼:等待GetByteArrayAsync在asp.net沒有返回

private async Task<XPathNavigator> UspsCreateAndPostRequest(string sUrl) 
{ 
    HttpClient client = new HttpClient(); 
    byte[] urlContents = await client.GetByteArrayAsync(sUrl); 
    string sResponse = System.Text.Encoding.UTF8.GetString(urlContents); 
    ... //more code to return XPathNavigator object based on response 
} 

如果我更改爲以下正常工作:

​​

的是事實上,方法簽名返回是一項任務<XPathNavigator>導致該問題?謝謝。

+0

不要在任務上調用'.Wait()',它會導致死鎖。 –

+0

@ScottChamberlain OP說它是工作版本:) – Eser

+0

@Eser因爲在鏈上的某個地方有一個'.Wait()'從UspsCreateAndPostRequest'返回的任務上。因爲他將它包裝在Task.Run中,所以他失去了執行上下文,這就是它工作的原因。做一個'.ConfigureAwait(false)'會用較少的資源達到相同的目標(但是,更好的辦法是將更高的等待時間固定在鏈上) –

回答

3

在調用堆棧的上方某處有一個.Wait()正在從UspsCreateAndPostRequest返回的任務上執行。

由於您將調用封裝在Task.Run中,因此您失去了執行上下文,這就是它工作的原因。這樣做

private async Task<XPathNavigator> UspsCreateAndPostRequest(string sUrl) 
{ 
    HttpClient client = new HttpClient(); 
    byte[] urlContents = await client.GetByteArrayAsync(sUrl).ConfigureAwait(false); 
    string sResponse = System.Text.Encoding.UTF8.GetString(urlContents); 
    ... //more code to return XPathNavigator object based on response 
} 

將實現以更少的資源相同的目標(但它會更好修復等待上漲的鏈)。

+0

我只是嘗試用「byte [] urlContents = await client.GetByteArrayAsync(sUrl).ConfigureAwait(false);」替換那3行,但仍然掛起並且不返回。 –

+0

按照調用堆棧,每個級別需要'.ConfigureAwait(false);'一直添加到它。 –