【发布时间】:2013-11-08 16:08:54
【问题描述】:
我的代码使用异步方法从多个来源加载数据(如下所示)。
public class ThEnvironment
{
public async Task LoadLookupsAsync(CancellationToken cancellationToken) { ... }
public async Task LoadFoldersAsync(CancellationToken cancellationToken) { ... }
}
在我的程序的其他地方,我想加载多个环境。
ThEnvironment[] workingEnvironments = ThEnvironment.Manager.GetWorkingEnvironments();
foreach ( ThEnvironment environment in workingEnvironments )
{
await environment.LoadLookupsAsync(CancellationToken.None);
await environment.LoadFoldersAsync(CancellationToken.None);
}
我的问题有两个:
- 对于任何单一环境,我将如何并行运行两个 environment.Load...Async() 方法并且仍然能够传递 CancellationToken?
- 如何并行处理所有环境?
底线:我想为所有环境并行运行所有 Load..Async() 方法,并且仍然能够传递 CancellationToken。
更新
感谢大家的快速解答。我已将代码缩减为以下内容:
Refresh();
var tasks = ThEnvironment.Manager.GetWorkingEnvironments()
.SelectMany(e => new Task[] { e.LoadLookupsAsync(CancellationToken.None), e.LoadFoldersAsync(CancellationToken.None) });
await Task.WhenAll(tasks.ToArray());
我不太关心捕获所有异常,因为这不是生产应用程序。顶部的 Refresh() 处理了表单的初始绘制问题。
到处都是很棒的东西。
【问题讨论】:
标签: .net async-await cancellation