假设我有两个资源A
and B
,我想通过 MVVM 向我的用户展示这两个内容(this == 视图模型)
this.A = GetA();
this.B = GetB();
当我开始使用 TPL 时:
this.A = await GetAAsync();
this.B = await GetBAsync();
这开始得到A
. When A
已准备就绪,显示A
并继续做同样的事情B
——这不是一个很好的解决方案。最好是:
var taskA = GetAAsync();
var taskB = GetBAsync();
this.A = await taskA;
this.B = await taskB;
现在,这开始变得A
,开始得到B
并等待A
. When 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());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)