c#-4.0 - Task.WaitAll() 不锁定主 UI

标签 c#-4.0

我将以下作业发送到多个线程以从主 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/

相关文章:

linq - 从多个版本项目中选择最新项目的 LINQ 是什么?

multithreading - C#.Net MVC线程中的共享变量

c#-4.0 - 如何获得程序集的强名称?

c# - 匿名并行任务计时器?

jquery - 将绘制的图像保存在asp.net服务器的canvas中

c# - 无法测试 SmtpClient.TimeOut

c# - List<uint> 在 .NET 4.0 中每个列表项有多大?

c# - 应用程序启动时的 Visual Studio 远程调试

jquery - json 中的最大字符串参数长度

c# - 等待事件触发而不阻塞