首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Task.WaitAll()而不锁定主UI

Task.WaitAll()而不锁定主UI
EN

Stack Overflow用户
提问于 2013-01-22 04:22:47
回答 2查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
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线程?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-22 04:27:08

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-22 04:24:35

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14446576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档