我可以等待特定的后台线程完成,然后另一个后台线程启动吗?

时间:2010-10-13 16:42:15

标签: .net multithreading

我可以等待特定的后台线程完成,然后另一个后台线程启动吗?

3 个答案:

答案 0 :(得分:6)

在.NET 4中,您可以使用Task而不是线程,然后使用continuation来实现您的目标:

var firstTask = Task.Factory.StartNew( () => PerformSomeLongRunningAction(); );

var secondTask = firstTask.ContinueWith( t => PerformSecondAction(); );

在.NET< = 3.5中,选项有所不同。最好的方法是使用WaitHandle来指示您的第二项任务。第一个后台线程需要在等待句柄完成时发出信号:

var mre = new ManualResetEvent(false);

ThreadPool.QueueUserWorkItem( o =>
      {
           PerformSomeLongRunningAction();
           mre.Set(); // Signal to second thread that it can continue
      });

ThreadPool.QueueUserWorkItem( o =>
      {
           mre.WaitOne(); // Wait for first thread to finish
           PerformSecondAction();
      });

答案 1 :(得分:4)

不确定。让第一个线程启动第二个线程,或设置某种标志告诉托管应用程序启动第二个线程。当然,我不得不问:如果这些线程总是按顺序运行,为什么要创建第二个线程而不是在第一个线程中执行所有工作呢?

答案 2 :(得分:3)

如果您提供更多信息,我们可以在答案中提供更多详细信息。

通常,您设置一个通信系统(消息队列,事件或委托),用于表示进程/步骤/线程已完成。当发生这种情况时,启动下一个线程。