假设我有两个资源 A
和 B
,我想通过 MVVM(这个 == View 模型)向我的用户展示这两个资源
this.A = GetA();
this.B = GetB();
一旦我开始使用 TPL:
this.A = await GetAAsync();
this.B = await GetBAsync();
这开始得到 A
。当 A
准备就绪时,它会显示 A
并继续对 B
做同样的事情——这不是一个很好的解决方案。最好是:
var taskA = GetAAsync();
var taskB = GetBAsync();
this.A = await taskA;
this.B = await taskB;
现在,开始获取A
,开始获取B
并等待A
。当 A
就绪时,它会显示 A
并等待 B
,直到它也显示出来。 看起来不错,但是,如果 A
有时比 B
需要更多的时间来加载怎么办?
我如何实现以下场景:
- 开始加载
A
。 - 开始加载
B
。 - 当其中一个准备好时,展示它。
- 当另一个准备好时,也展示它。
?
最佳答案
最简单的选择就是将异步操作与更新本身结合起来,然后您可以开始并等待这两个操作,但是当每个操作完成时,它会更新它需要的内容。您可以通过在每个方法的末尾“粘贴”更新或创建一个像这样的异步包装方法来做到这一点:
async Task UpdateAAsync()
{
A = await GetAAsync();
}
async Task UpdateBAsync()
{
B = await GetBAsync();
}
await Task.WhenAll(UpdateAAsync(), UpdateBAsync());
或者,正如 svick 所建议的,您可以使用包装器 lambda 表达式代替包装器方法:
Func<Task> updateAAsync = async () => A = await GetAAsync();
Func<Task> updateBAsync = async () => B = await GetBAsync();
await Task.WhenAll(updateAAsync(), updateBAsync());
关于c# - 等待多个任务显示在 GUI 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25933159/