我有使用异步方法从多个来源加载数据的代码(如下所示)。
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() 处理了表单的初始绘制问题。
到处都是很棒的东西。