我正在阅读关于async & await的几篇博客,尤其是Scott的博客。下面有一个代码示例,它可能会下载一系列URL。为了简化事情并使时间合理且可重复,我用Task.Delay可等待调用替换了真正的下载代码。
第一个代码在lambda表达式中没有async-await对,而第二个代码有。两个代码都编译,时间都相同(大约1秒)。
1.) 哪种方法是正确的?
2.) lambda内部的await async对是否会增加成本?
第一个代码在lambda表达式中没有async-await对,而第二个代码有。两个代码都编译,时间都相同(大约1秒)。
1.) 哪种方法是正确的?
2.) lambda内部的await async对是否会增加成本?
private async void Button_Click(object sender, RoutedEventArgs e)
{
// Capture the UI synchronization context for use later
var ui = TaskScheduler.FromCurrentSynchronizationContext();
// SAMPLE 1 , is this the right way?
var items = Enumerable.Range(1, 100).Select(i => i.ToString()).ToList();
var sp = new Stopwatch();
sp.Start();
// NO await async pair in lambda
var results1 = await Task.WhenAll(
items.Select(item => DownloadFileAsync(item)));
sp.Stop();
var testResult = string.Format("Single await: {0} seconds"
, sp.Elapsed.TotalSeconds);
// SAMPLE 2, or this way?
var items1 = Enumerable.Range(1, 100).Select(i => i.ToString()).ToList();
var sp1 = new Stopwatch();
sp1.Start();
// WITH await async pair in lambda
var results = await Task.WhenAll(items1.Select(async item =>
await DownloadFileAsync(item)));
sp1.Stop();
var testResult1 = string.Format("Double await: {0} seconds",
sp1.Elapsed.TotalSeconds);
// show results
await Task.Factory.StartNew(() =>
{
MessageBox.Show(testResult + System.Environment.NewLine + testResult1);
}, CancellationToken.None, TaskCreationOptions.None,
ui).ConfigureAwait(false);
}
并且
private async Task<string> DownloadFileAsync(string uri)
{
//using (var client = new WebClient())
//{
// string data = await
client.DownloadStringTaskAsync(uri).ConfigureAwait(false);
// return data;
//}
await Task.Delay(1000).ConfigureAwait(false);
return uri;
}