可以說,在ASP.NET應用程序,WCF或Web API中,即將與此應用程序作業聯繫的第三方的一部分。我喜歡這樣做異步或非阻塞,以便線程池不餓。不過,我不想在服務中更改我的所有代碼,只有使網絡調用的位。如何在asp.net中執行異步Web調用
下面是一些代碼,我已經寫了:
public string GetSomeData()
{
Task<string> stuff = CallApiAsync();
return stuff.result; //does this block here?
}
private async Task<string> CallApiasync()
{
using (var httpClient = new HttpClient())
{
string response = await httpClient.GetStringAsync(Util.EndPoint).ConfigureAwait(false);
return response;
}
}
我認爲這個想法是如下,但請糾正任何誤解。
CallApi的調用者可以調用該方法,當它等待時,會創建一個代表某些工作異步完成的任務,但這需要一些時間。此時,線程到達等待線程池的返回值,以執行其他操作,即處理不同的請求。一旦任務完成,await行喚醒並且代碼從那裏繼續,就好像它是同步的。
如果是這種情況,爲什麼我需要從我的apimethod返回一個任務。調用者似乎不得不調用stuff.Result這意味着任務可能沒有完成,並且調用結果可能會阻止?注意,我不想讓調用方法異步,因爲那樣的調用方法需要異步等等。
在我的代碼中,事件的順序是什麼?
另一個問題是爲什麼我需要將configureAwait設置爲false?否則一切都會掛起。
好的答案謝謝,我現在明白我錯了。我不確定異步是簡單的演示應用程序之外的所有有用的東西。在我的情況下,我們有一段可以進行Web調用的庫代碼,但在此之前我們有大量的業務邏輯。這意味着異步/等待和任務將泄漏我的代碼。所有我想要以非阻塞的方式發生!我最好的選擇是什麼,或者他們說沒有免費的午餐 –
你最好的選擇是擁抱'async'。不要將其視爲*感染*您的代碼;相反,'async'只會告訴你哪部分代碼是自然異步的。 –