我有一些 UI 代码,其中有一个如下所示的方法:
private async Task UpdateStatusAsync()
{
//Do stuff on UI thread...
var result = await Task.Run(DoBunchOfStuffInBackground);
//Update UI based on result of background processing...
}
目标是让 UI 在任何影响其状态的属性更改时更新相对复杂的计算状态。这里有几个问题:
- 如果我只是从每个更新状态的地方直接调用此方法,最终更新的状态可能不正确。假设属性 A 发生变化,然后属性 B 发生变化。尽管 B 在 A 之后调用 UpdateStatusAsync,但有时回调代码(最终的 UI 更新)会以相反的顺序发生。所以:(A->更新)->(B->更新)->(B更新)->(A更新)。这意味着最终的 UI 显示的是陈旧状态(反映 A,但不反映 B)。
- 如果我总是等待先前的 UpdateStatusAsync 首先完成(我目前正在做的事情),我可能会多次执行昂贵的状态计算。理想情况下,我应该只需要为一系列更新进行“最后一次”计算。
我正在寻找的是一个干净的模式,它可以完成以下任务:
- 最终状态永远不会“陈旧”超过一小段时间(即我不希望 UI 与底层状态不同步)
- 如果在短时间内发生多个更新调用(常见用例),我宁愿避免重复工作,而是始终计算“最新”更新。
- 由于在某些情况下,多个更新可能非常接近(即在几毫秒内)发生,因此如果有其他更新请求进来,有一种方法可以避免在短时间内开始处理会很方便。
看起来这应该是一个相当普遍的问题,所以我想我会在这里问是否有人知道一种特别干净的方法。