static async Task DownLoad(GetContentsAsync GetContentsAsync) { await DownLoadInner(GetContentsAsync).ConfigureAwait(false); await DownLoadInner(GetContentsAsync).ConfigureAwait(false); //await Task.WhenAll(new Task[]{ DownLoadInner(GetContentsAsync), DownLoadInner(GetContentsAsync)}); //如果用了WhenAll,则两个会同时执行,而无法利用Cahche的结果。 }
static async Task DownLoadInner(GetContentsAsync GetContentsAsync) { string[] urls = new string[] { "http://msdn.microsoft.com", "http://www.contoso.com", "http://www.microsoft.com" }; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var results = await Task.WhenAll(urls.Select(url => GetContentsAsync(url))).ConfigureAwait(false); stopwatch.Stop(); Console.WriteLine("Retrieved {0} characters. Elapsed time was {1} ms.", results.Sum(result => result.Length), stopwatch.ElapsedMilliseconds); }
public static Task <string> GetContentsAsync(string url) { Task <string> contents; if (!s_urlToContents.TryGetValue(url, out contents)) { Console.WriteLine("Before call @" + Thread.CurrentThread.ManagedThreadId); GetContentsAsync GetContentsAsyncInner = async(u) => { Console.WriteLine("async {@" + Thread.CurrentThread.ManagedThreadId); var content = await new WebClient().DownloadStringTaskAsync(url); //var content = await new WebClient().DownloadStringTaskAsync(url).ConfigureAwait(false); Console.WriteLine("async }@" + Thread.CurrentThread.ManagedThreadId); s_urlToContents.TryAdd(url, Task.FromResult(content)); return(content); }; //这个版本试验直接在里面定义async lambda contents = GetContentsAsyncInner(url); } return(contents); }