【发布时间】:2021-08-31 17:16:00
【问题描述】:
考虑一个返回带有一些值的任务的 API。
我想根据这些值并行更新 UI(当其中一个值准备好时,我想更新它而不等待第二个值,假设每个值的更新都是它自己的更新方法)。
public async Task MyFunc()
{
Task<First> firstTask = MyAPI.GetFirstValue();
Task<Second> secondTask = MyAPI.GetSecondValue();
UpdateFirstValueUI(await firstTask)
UpdateSecondValueUI(await secondTask)
}
代码示例将等待第一个值,更新 UI,等待第二个值并再次更新 UI。
该场景的最佳做法是什么?我想知道ContinueWith 是否是最佳实践,因为我主要在遗留代码中看到它(之前有async-await)。
用一个更好的例子编辑: 假设我们有该 API 的两个实现并且代码看起来像这样
public async Task MyFunc()
{
Task<First> firstTask = null
Task<Second> secondTask = null
if (someCondition)
{
firstTask = MyAPI1.GetFirstValue();
secondTask = MyAPI1.GetSecondValue();
}
else
{
firstTask = MyAPI2.GetFirstValue();
secondTask = MyAPI2.GetSecondValue();
}
UpdateFirstValueUI(await firstTask)
UpdateSecondValueUI(await secondTask)
}
现在如您所见,我不想在两个不同的分支中调用更新方法(假设我们在分支后为每个 API 拆分该方法) 所以寻找一种方法来仅更改更新调用,以便它们可以并行发生
【问题讨论】:
-
您无法在任何操作系统中从另一个线程更新 UI - 无论是 Windows、Mac 还是 Linux。如果要显示后台线程的进度,可以使用
Progress类。根据您使用的 UI 堆栈(WinForms?WPF?UWP?Xamarin?MAUI?),您可以更新 ViewModel 对象,任何绑定的 UI 元素都会自行更新 -
@Selvin 避免等待所有任务完成。
-
await Task.WhenAll(CallGetFirstValueAndUpdateUI(), CallGetSecondValueAndUpdateUI());... 其中CallGetFirstValueAndUpdateUI以类似方式定义为async Task CallGetFirstValueAndUpdateUI() { Task<First> firstTask = MyAPI.GetFirstValue(); UpdateFirstValueUI(await firstTask);}... 和CallGetSecondValueAndUpdateUI
标签: c# asynchronous async-await