所以我有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,但我想知道这是正确/最佳/明智的方法吗?
答案 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());