在async/await模式的异步方法中,有时你也会希望用await表达式来等待Task。这时异步方法会返回到调用方法,但该异步方法会等待一个或所有任务完成。你可以通过Task.WhenAll 或 Task.WhenAny方法来实现。这两个方法又被称为组合子(combination)。
下面的代码展示了一个使用Task.WhenAll方法的示例。它异步地等待所有与之相关的Task完成,不会占用主线程的时间。
public class MyDownLoadString
{
Stopwatch sw = new Stopwatch();
public void DoRun()
{
Task<int> t = CountCharactersAsync(2, "http://www.microsoft.com","http://www.baidu.com");
Console.WriteLine("DoRun: Task {0} Finished", t.IsCompleted ? string.Empty : "Not");
Console.WriteLine("DoRun: Result = {0}", t.Result);
}
private async Task<int> CountCharactersAsync(string site1, string site2)
{
var wc1 = new WebClient();
var wc2 = new WebClient();
var t1 = wc1.DownloadStringTaskAsync(new Uri(site1));
var t2 = wc2.DownloadStringTaskAsync(new Uri(site2));
List<Task<string>> tasks = new List<Task<string>>() { t1, t2 };
await Task.WhenAll(tasks);
Console.WriteLine(" CCA: T1 {0} Finished", t1.IsCompleted ? string.Empty : "Not ");
Console.WriteLine(" CCA: T2 {0} Finished", t2.IsCompleted ? string.Empty : "Not ");
return t1.IsCompleted ? t1.Result.Length : t2.Result.Length;
}
}
class Program
{
static void Main()
{
MyDownLoadString ds = new MyDownLoadString();
ds.DoRun();
}
}
同理,Task.WhenAny组合子会异步地等待与之相关的某个Task完成。
网友评论