我在ASP.NET WebForms網站上有一個服務器端單擊事件。在這個事件中,我調用一個方法,該方法又調用其異步合作伙伴方法,在呼叫中添加.Wait()
。然後在異步方法調用.Wait()和Task.Run()之間的區別Wait()
該方法進入幾個層次向下(即,調用另一個異步方法,它調用另一個異步方法,等等),並最終調用一個HttpClient的對象上的異步方法。此時線程似乎消失在兔子洞下;該方法永遠不會回調。
現在,我知道異步系列調用按預期工作,因爲相同的代碼也是從Web API控制器調用的(控制器方法調用第一個方法的異步版本,而不是同步的「夥伴」方法) ,它完全異步,並且按預期返回。
所以基本上我有這樣的事情,它永遠不會返回
protected void btn_Click(object sender, EventArgs e)
> Class1.DoSomething()
> Class1.DoSomethingAsync.Wait()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync() // never returns
}
我也嘗試後第一個異步方法,但沒有任何成功使用.ConfigureAwait(false)
。
我也有這個,這確實返回
Task<IHttpActionResult> MyWebApiMethod()
> await Class1.DoSomethingAsync()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync() // does return
}
我發現我可以做的第一個版本的工作,如果我將其更改爲以下:
protected void btn_Click(object sender, EventArgs e)
> Class1.DoSomething()
> Task.Run(async() => await Class1.DoSomethingAsync()).Wait()
...
> await ClassN.Authenticate()
{
await myHttpClient.PostAsync()
}
但我不知道爲什麼。
誰能解釋調用
Class1.DoSomethingAsync.Wait()
,並呼籲
Task.Run(async() => await Class1.DoSomethingAsync()).Wait()
爲什麼不以正確的方式使用它。 'async void btn_Click'和'await Class1.DoSomethingAsync()'? – user3185569
不要對已有的異步方法使用'Task.Run',這是線程的浪費。只需更改'button_click'事件處理程序的簽名爲@ user3185569建議 – Fabio
@ user3185569 - 我沒有使用過,因爲我不知道我可以在服務器端WebForms事件中使用'async'。謝謝你指出我。 – awj