c# - 等待多个任务显示在 GUI 中

标签 c# .net silverlight task-parallel-library async-await

假设我有两个资源 AB,我想通过 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/

相关文章:

c# - RestSharp - 如何影响 JSON 序列化(命名)?

c# - 使用 C#,确定页面上对象的 "left"位置以使其水平均匀分布的最佳逻辑是什么?

c# - 在 .net 中使用 AOP 登录

c# - 如何使 IEnumerable<T> 只读?

c# - Silverlight/C# 图像未找到异常处理

c# - 实现 IEnumerable<T> 和 IEnumerator<T> 时 GetEnumerator() 的推荐行为

c# - 如何根据MAUI中的绑定(bind)值显示文本

c# - 使用 WCF RIA 服务的多个 LoadOperations 模式

c# - 如何将 TabItem GotFocus 绑定(bind)到 ViewModel 命令

.net - WCF 契约(Contract)方法可以返回 null 吗?