2017-04-27 31 views
-1
async void Main() 
{ 
    var cp=new ConentProxy(); 
    Console.WriteLine(await cp.GetAsync()); 
    Console.ReadLine(); 
} 

// Define other methods and classes here 
public class HttpsContentProvider : IContentProvider 
{ 
    private static HttpClient hc=new HttpClient(); 

    //**@No.1** 
    public async Task<string> GetAsync() { 
     return await hc.GetStringAsync("https://www.stackoverflow.com").ConfigureAwait(false); 
    } 
} 

public class DefaultContentProvider : IContentProvider 
{ 
    //**@No.2** 
    public async Task<string> GetAsync() 
    { 
     return await Task.FromResult("Default").ConfigureAwait(false); 
    } 
} 
public interface IContentProvider 
{ 
    Task<string> GetAsync(); 
} 

public class ConentProxy : IContentProvider 
{ 
    public static int conentType = int.Parse(ConfigurationManager.AppSettings["UseHttps"] ?? "0"); 

    //**@No.3** 
    public async Task<string> GetAsync() 
    { 
     switch (conentType) 
     { 
      case 0:return await new HttpsContentProvider().GetAsync(); 
      default:return await new DefaultContentProvider().GetAsync(); 
     } 
    } 
} 

在上面的代碼中,有三個「異步」,前面帶有「@No。」標籤。它們都是簡短的方法,只有一兩行。我應該添加一個「異步」到一個簡短的方法嗎?

他們可以等待沒有「異步」,因爲他們返回TaskTask<T>

在實際代碼中,它可能遠遠超過1號標籤上的2個呼叫層。所以會有很多「異步」級聯。

我應該增加一個「異步」的短期方法或沒有?據我所知,asyncawait的成本;

Especilly No.3,它只是一種代理方法。真正的操作方法將阻塞是HttpClient.GetStringAsync@一號

============================================== =======

閱讀從@dustinmoris第一個答案之後,我發現下面的代碼HttpClient類。這讓我感到困惑,沒有async並沒有ConfigureAwait(false),這是一樣的HttpClient

public Task<byte[]> ReadAsByteArrayAsync() 
{ 
    this.CheckDisposed(); 
    TaskCompletionSource<byte[]> tcs = new TaskCompletionSource<byte[]>(); 
    this.LoadIntoBufferAsync().ContinueWithStandard((Action<Task>) (task => 
    { 
     if (HttpUtilities.HandleFaultsAndCancelation<byte[]>(task, tcs)) 
      return; 
     tcs.TrySetResult(this.bufferedContent.ToArray()); 
    })); 
    return tcs.Task; 
} 
+0

只有ü如果操作需要時間,則爲異步,例如HTTP請求。不要確定是否按方法的長度使用異步。 – Sweeper

+1

我的經驗法則是不是* *開始編寫任何方法'async'。在我需要插入'await'的時候,我會添加'async'。但是在你的例子中,你的方法只是'返回等待',我會說你不需要'await'(如果方法不是'async')。 –

回答

0

其他方法在技術上有更好的解釋,但對於初學者經驗法則應該是:

使用異步當

  1. 庫爲您提供了異步選項,則一般是做一些東西,將極大的受益異步(HttpClient的,StreamReader的等)
  2. 如果因爲1,你必須使用異步的地方,那麼你必須異步了所有的方式使用,因爲它調用到您的異步方法每個更高級別的方法現在基本上也是異步。
  3. 如果1和2不適用,不轉的方法到異步否則

方法的長度無關,用它做,實際上是小的方法比較好,因爲這是好的編碼實踐的一個標誌。

異步的額外成本/等待,即使是從字面上在你的代碼一般是由收益勝過你當你按照規則1和2

現在,如果你必須回答的問題裝飾用異步的方法,如果你可以直接返回任務:

相關問題