假设我有以下代码:
private async void Button_Click_0(object sender, RoutedEventArgs e)
{
await RunTask("alfa", 1000);
}
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await RunTask("beta", 5000);
}
private async Task RunTask(string taskname, int delay)
{
LabelTaskStatus.Content = "Running " + taskname + "...";
await Task.Delay(delay);
LabelTaskStatus.Content = "Finished with " + taskname;
}
如果我按下按钮,它将在一秒钟内运行任务“alfa”,然后显示结果。第二个将运行任务“beta”,然后显示结果。
假设我启动测试版任务,然后立即启动任务alfa。任务alfa完成后几秒钟,我将看到任务测试结果。我不希望这样,我只想从最新启动的任务中得到结果。
如何以正确的方式获得此结果?我可以发明几种方法来做到这一点,但我想知道智能开发人员如何处理这个问题:-)。取消任务是我想的一种处理方法,但是如果你想让任务保持运行并且只是想忽略对用户的反馈呢?
答案 0 :(得分:4)
在表单中添加一个存储当前活动任务的字段 在每个异步方法的开头,将此字段设置为当前方法的标识符。
异步工作完成后,如果此字段未更改,则仅更新UI。
答案 1 :(得分:1)
这是一个关于UI如何在其他线程上运行异步操作的问题。 当你并行执行它时,它变得难以管理(对我来说无论如何)所以我喜欢使用某种队列。 UI将一些工作排队,另一方的线程将该任务列为队列并运行它,并且只有在队列为空时线程才会更新UI。