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。」標籤。它們都是簡短的方法,只有一兩行。我應該添加一個「異步」到一個簡短的方法嗎?
他們可以等待沒有「異步」,因爲他們返回Task
或Task<T>
。
在實際代碼中,它可能遠遠超過1號標籤上的2個呼叫層。所以會有很多「異步」級聯。
我應該增加一個「異步」的短期方法或沒有?據我所知,async
和await
的成本;
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;
}
只有ü如果操作需要時間,則爲異步,例如HTTP請求。不要確定是否按方法的長度使用異步。 – Sweeper
我的經驗法則是不是* *開始編寫任何方法'async'。在我需要插入'await'的時候,我會添加'async'。但是在你的例子中,你的方法只是'返回等待',我會說你不需要'await'(如果方法不是'async')。 –