同时运行多个等待

我有一个看起来像这样的代码:

firstList = await GetFirstListFilesAsync(); textBlock1.Text = "found " + firstList.Count + " first list's results"; secondList = await GetSecondListFilesAsync(); textBlock2.Text = "found " + secondList.Count + " second list's results"; thirdList = await GetThirdListFilesAsync(); textBlock3.Text = "found " + thirdList.Count + " third list's results" 

所以现在它获得第一个列表,设置第一个TextBlock文本,然后获取第二个列表,设置第二个TextBlock文本,然后获取第三个列表并设置第三个TextBlock文本。 但我希望所有等待操作同时运行,因此所有TextBlock都会同时更新或更少。 或者可能不是同时 – 每个TextBlock都会在相应的await方法完成时更新。 无论如何,我想在这里实现的目标是更快地获得结果。 如果我一个接一个地运行这些方法,它们会等到上一个完成,但是如果它们同时运行,第三个方法会更快地返回结果,对吧? 所以我的问题是 – 这可能吗? 如果是,那怎么样?

我认为这就是你要找的东西:

 var tasks = new Task[3]; tasks[0] = GetFirstListFilesAsync(); tasks[1] = GetSecondListFilesAsync(); tasks[2] = GetThirdListFilesAsync(); // At this point, all three tasks are running at the same time. // Now, we await them all. await Task.WhenAll(tasks); // Get an individual result, where result is MyMethodReturnObject var myText = tasks[0].Result; // Loop through results var results = tasks.Select(o => o.Result).ToList(); foreach (var result in results) { Console.Write(result); } 

资料来源: http : //blog.stephencleary.com/2012/02/async-and-await.html

您可以尝试将工作转移到Task的集合中,并使用Task.WaitAll来加入线程。

使用david的答案或者就像将所有等待放在一起一样简单然后调用set text值,如下所示:

 firstList = await GetFirstListFilesAsync(); secondList = await GetSecondListFilesAsync(); thirdList = await GetThirdListFilesAsync(); textBlock1.Text = "found " + firstList.Count + " first list's results"; textBlock2.Text = "found " + secondList.Count + " second list's results"; textBlock3.Text = "found " + thirdList.Count + " third list's results" 

因此,您不希望对await块进行分组,您希望指定完成时发生的情况。

 GetFirstListFilesAsync().ContinueWith(task => { textBlock1.Text = "found " + task.Result.Count + " first list's results"; }); GetSecondListFilesAsync().ContinueWith(task => { textBlock2.Text = "found " + task.Result.Count + " second list's results"; }); GetThirdListFilesAsync().ContinueWith(task => { textBlock3.Text = "found " + task.Result.Count + " third list's results"; }); 

这种方式是最快的方法,因为一旦Task完成,你的textBlock.Text将被设置,他们不会等待前一个完成。

我希望所有等待操作同时运行,因此所有TextBlocks会同时更新或更少。 或者可能不是同时 – 每个TextBlock都会在相应的await方法完成时更新。

然后定义一些新方法:

 private async Task GetFirstListFilesAndDisplayAsync() { var firstList = await GetFirstListFilesAsync(); textBlock1.Text = "found " + firstList.Count + " first list's results"; } private async Task GetSecondListFilesAndDisplayAsync() { var secondList = await GetSecondListFilesAsync(); textBlock2.Text = "found " + secondList.Count + " second list's results"; } private async Task GetThirdListFilesAndDisplayAsync() { var thirdList = await GetThirdListFilesAsync(); textBlock3.Text = "found " + thirdList.Count + " third list's results"; } 

然后同时调用它们:

 var firstTask = GetFirstListFilesAndDisplayAsync(); var secondTask = GetSecondListFilesAndDisplayAsync(); var thirdTask = GetThirdListFilesAndDisplayAsync(); await Task.WhenAll(firstTask, secondTask, thirdTask); firstList = await firstTask; secondList = await secondTask; thirdList = await thirdTask; 

只需从实际的await分离你的await创造

 var firstWait = GetFirstListFilesAsync(); var secondWait = GetSecondListFilesAsync(); var thirdWait = GetThirdListFilesAsync(); firstList = await firstWait; textBlock1.Text = "found " + firstList.Count + " first list's results"; secondList = await secondWait ; textBlock2.Text = "found " + secondList.Count + " second list's results"; thirdList = await thirdWait ; textBlock3.Text = "found " + thirdList.Count + " third list's results"; 

在第一个项目完成之前,这仍然不会显示任何结果,但允许并行进行。 如果你想在单个函数内完成每个函数,那么它会更复杂,因为你必须在等待的集合上等待WaitAny,然后确定(手动)哪个已经完成,从集合中删除它们并循环直到所有完成。