跟踪活动任务

时间:2013-12-08 17:46:09

标签: c# asynchronous multitasking async-await

假设我有以下代码:

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完成后几秒钟,我将看到任务测试结果。我不希望这样,我只想从最新启动的任务中得到结果。

如何以正确的方式获得此结果?我可以发明几种方法来做到这一点,但我想知道智能开发人员如何处理这个问题:-)。取消任务是我想的一种处理方法,但是如果你想让任务保持运行并且只是想忽略对用户的反馈呢?

2 个答案:

答案 0 :(得分:4)

在表单中添加一个存储当前活动任务的字段 在每个异步方法的开头,将此字段设置为当前方法的标识符。

异步工作完成后,如果此字段未更改,则仅更新UI。

答案 1 :(得分:1)

这是一个关于UI如何在其他线程上运行异步操作的问题。 当你并行执行它时,它变得难以管理(对我来说无论如何)所以我喜欢使用某种队列。 UI将一些工作排​​队,另一方的线程将该任务列为队列并运行它,并且只有在队列为空时线程才会更新UI。