2

我将以下作业发送到多个线程以从主 UI 线程进行处理。完成所有作业后,我需要发出一条消息“作业已完成”,让用户知道它已完成。

LimitedTaskScheduler scheduler = new LimitedTaskScheduler(4);
TaskFactory factory = new TaskFactory(scheduler);
MessageBox.Show("Job started");
for (int i = 0; i < rows.Length; i++)
{
  string tabName = rows[i]["TableName"].ToString();
  int nStatus;
  factory.StartNew<int>(() =>
  {
   nStatus = ProcessTable(tabName);
   return nStatus;
  });
}
MessageBox.Show("Job finished");

在上面的代码中,MessageBox.Show("Job finished"); 任务发送后立即执行,这是错误的。如果我使用 Task.WaitAll(); 它会锁定我不想要的主 UI 线程。

我的问题是在所有任务完成而不锁定主 UI 线程的情况下显示“作业完成”消息的最佳方式是什么?

提前致谢。

4

2 回答 2

1

您应该使用Task.WhenAll()创建一个新任务,该任务将在所有其他任务完成后完成。

然后,您可以调用ContinueWith()该任务以在 UI 线程上运行回调。

于 2013-01-21T20:24:34.560 回答
1

如果您只需要通知用户,只需为任务创建一个延续,但传递您通过UI 线程中TaskScheduler的调用获得的延续。TaskScheduler.FromCurrentSynchronizationContext

此延续将在父任务完成后在 UI 线程中执行。

于 2013-01-21T20:27:07.700 回答