我从主UI线程将以下作业发送到多个线程进行处理。在完成所有作业后,我需要发出一条消息"Job completed“,让用户知道它已经完成。
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(“作业完成”);是在任务发送之后立即执行的,这是错误的。如果我使用Task.WaitAll(),它将锁定我不希望它锁住的主UI线程。
我的问题是,在所有任务完成后显示“作业已完成”消息的最佳方式是什么,同时又不锁定主UI线程?
提前谢谢。
发布于 2013-01-22 04:27:08
如果您只需要通知用户,只需为任务创建一个continuation,但传递通过在UI线程中调用TaskScheduler.FromCurrentSynchronizationContext获得的TaskScheduler。
此继续操作将在父任务完成后在UI线程中执行。
发布于 2013-01-22 04:24:35
您应该使用Task.WhenAll()创建一个新任务,该任务将在所有其他任务完成后完成。
然后,您可以在该任务上调用ContinueWith()以在UI线程上运行回调。
https://stackoverflow.com/questions/14446576
复制相似问题