2013-05-15 99 views
76

我有一種情況,我正在調用一個返回的方法和IDisposable實例。例如:使用語句和等待關鍵字在c#中很好地播放使用#

HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")); 

現在擺在async是在現場,與IDisposable情況下工作時,這種通話和代碼所用的「反應」變量將被包裹在一個using語句。

我的問題是,當關鍵字async被混入時,這是否仍然是正確的方法?即使代碼編譯完成,使用語句在下面的兩個例子中是否仍能按預期工作?

實施例1對

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"))) 
{ 
    // Do something with the response 

    return true; 
} 

實施例2

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"))) 
{ 
    await this.responseLogger.LogResponseAsync(response); 

    return true; 
} 

回答

77

是的,這應該是很好。

在第一種情況下,你真的說:

  • 異步等到我們能得到的迴應
  • 使用它,並立即對其進行處理

在第二種情況下,你在說:

  • 異步等待,直到我們可以得到迴應
  • 異步等到我們記錄的響應
  • 處置的響應

在異步方法的using說法是「奇」,該Dispose呼叫可以在不同的線程執行的其中一個獲得資源(取決於同步上下文等),但它仍然會發生......當然,假設你正在等待的東西顯示或失敗。 (就像你不會在非異步代碼中調用Dispose,如果你的using聲明包含對永不返回方法的調用)。

+3

感謝Jon。雖然大多數異步內容對我來說仍然是伏都教,但看到它與其他.net功能集成的頻率並且只是起作用 – swingdoctor