多个任务,完成时的每个更新UI

时间:2017-10-06 14:39:22

标签: c# wpf task

所以我有BackgroundWorker运行一堆像这样的任务;

taskList.Add(Task.Factory.StartNew(Task1));
taskList.Add(Task.Factory.StartNew(Task2));
...
Task.WaitAll(taskList.ToArray());

将它们放在一个worker中,这样我就可以在XAML中显示一个加载图标。然后worker.RunWorkerCompleted将删除加载图标,并在完成所有任务后将UI释放给用户。

接下来,我想在任务完成时更新加载UI。即当第一个任务完成加载图标下的标签时会说“任务1完成”等等。

完成此操作的最佳方法是什么?我认为我可以将任务更改为BackgroundWorkers,然后使用他们的RunWorkerCompleted事件来更新UI,但我想知道这是正确/最佳/明智的方法吗?

2 个答案:

答案 0 :(得分:2)

每个单独的任务可以通过UI线程的调度程序更新UI:

taskList.Add(Task.Run(() =>
{
    // do lengthy operation

    Application.Current.Dispatcher.Invoke(() =>
    {
        // update UI
    });
}));

然后按Task.WhenAll等待所有任务并进行最终的UI更新:

await Task.WhenAll(taskList.ToArray());

// update UI

不需要BackgroundWorker。

答案 1 :(得分:-1)

如果我正确理解您的问题,您可以使用ContinueWith方法并在调用(UI)线程上启动任务:

Task t1 = Task.Factory.StartNew(Task1);
t1.ContinueWith(task => 
{
    Application.Current.Dispatcher.BeginInvoke(new Action(() =>
    {
        textBlock1.Text = "t1 completed";
    }));
});
taskList.Add(t1);

...
await Task.WhenAll(taskList.ToArray());