與線程相比,我不太瞭解異步/等待好處。異步/等待方法中耗時的任務
如果在一個方法中,我有一個沒有異步/等待版本的操作,在其他異步操作過程中消耗一些時間,如20ms。
調用這個方法1000次,因爲異步/等待只在一個線程內執行,它會在我的測試中使用至少20ms×1000次(使用Thread.Sleep來模擬)。
對異步/等待有任何誤解嗎?
public void Start()
{
Task[] task = new Task[500];
for (int i = 0; i < 500; i++)
{
task[i] = AsyncGet();
}
await Task.WhenAll(task);
}
public async Task<bool> AsyncGet()
{
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.example.com");
req.Method = "GET";
using(HttpWebResponse res = (HttpWebResponse)await req.GetResponseAsync())
{
Thread.Sleep(20);//Simulate an operation without async/await version that consume a little bit time
using (Stream responseStream = res.GetResponseStream())
{
StreamReader sr = new StreamReader(responseStream, Encoding.ASCII);
string resp = await sr.ReadToEndAsync();
}
}
}
更新問題:
如果我有必要做一些非異步/等待操作就像使用外部庫獲取HTTP響應後操縱JSON。避免浪費時間的最佳做法是什麼?
爲什麼只有1個線程,它使用線程池中的任何可用線程。 – 2014-09-06 10:26:59
您通常會盡量避免使用非異步持久操作。或者在同步上下文無關緊要的情況下,可以在返回的Task對象上使用'ConfigureAwait(false)'來讓繼續在任何上下文繼續。 – Dirk 2014-09-06 10:27:47
@eranotzap發佈的代碼在1個線程上運行。 'GetResponseAsync'可能在內部使用另一個線程,但考慮到這是一個IO操作,它更有可能使用類似IO完成端口的東西。 – Dirk 2014-09-06 10:29:48