我将以下作业发送到多个线程以从主 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("作业完成");任务发送后立即执行,这是错误的。 如果我使用 Task.WaitAll();它会锁定主 UI 线程,但我不希望它这样做。
我的问题是在所有任务完成后显示“作业完成”消息而不锁定主 UI 线程的最佳方式是什么?
提前致谢。
最佳答案
如果您只需要通知用户,只需创建 continuation任务,但传递通过在 UI 线程中调用 TaskScheduler.FromCurrentSynchronizationContext
获得的 TaskScheduler
。
父任务完成后,此延续将在 UI 线程中执行。
关于c#-4.0 - Task.WaitAll() 不锁定主 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14446576/