2014-04-17 24 views
0

可以說,在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?否則一切都會掛起。

回答

6

我喜歡這樣做異步或非阻塞,以便線程池不餓。不過,我不想在服務中更改我的所有代碼,只有使網絡調用的位。

那是不可能的。爲了實現真正的異步,您必須必須允許async通過代碼「增長」,只要它需要。你試圖做的是阻止異步調用,這不會給你帶來任何好處(你可以通過使用async釋放線程,但是然後你使用Result轉向並消耗線程)。

此時線程到達await返回線程池做其他事情,即處理不同的請求。

不完全。當async方法遇到await時,它將不完整的Task返回給其調用者。如果主叫方,反過來,await s表示任務,然後返回一個不完整的Task來電者等。當ASP.NET運行時接收到來自你的動作/服務方法不完全Task /不管,然後它將線程釋放到線程池。

所以,你一定要去「async一路」才能看到async的真正好處。

我在我的博客上async intro如果你想要一個更溫和的介紹,以及對async best practices的MSDN文章(其中之一是:async一路)。我還有一篇博客文章,介紹deadlock you were seeing

+0

好的答案謝謝,我現在明白我錯了。我不確定異步是簡單的演示應用程序之外的所有有用的東西。在我的情況下,我們有一段可以進行Web調用的庫代碼,但在此之前我們有大量的業務邏輯。這意味着異步/等待和任務將泄漏我的代碼。所有我想要以非阻塞的方式發生!我最好的選擇是什麼,或者他們說沒有免費的午餐 –

+0

你最好的選擇是擁抱'async'。不要將其視爲*感染*您的代碼;相反,'async'只會告訴你哪部分代碼是自然異步的。 –

1

編譯器爲你處理異步模式背後的許多魔術,但從語法上講,你必須通過提供一個方法原型來告訴它你想做什麼,它說:「好吧,這是一個異步操作,可以等待。「

要發生這種情況,您的方法必須返回TaskTask<T>。 任何任務都可以等待。

使用.Result和.Wait()時應該非常小心,因爲它們可能會在一些非常意外的情況下阻塞,因爲運行時可能決定同步執行您的方法。

您應該說: await CallApiAsync();

,或者實際利用它的優勢:

Task stuff = CallApiAsync(); 

//More code that can happen independetly of "stuff" 

await stuff; 

爲了做到這一點,你GetSomeData()函數必須也被標記爲異步,但它不就得了,本身返回任務。

完成了你的代碼的工作異步版本副本:

公共異步串GetSomeData(){ 任務 東西= CallApiAsync();老實說,如果這是所有的CallApiAsync函數都要做的事情,那麼你也可以將它內聯到它,儘管如此。

相關問題