多线程问题 - 线程完成后需要事件

时间:2012-12-12 23:08:20

标签: c# multithreading

我正在设计一个多线程进程,我创建一个线程来进行一些处理,以便不锁定UI。但是,当这个线程完成时(如果它成功完成没有错误)我需要一个事件,所以我可以在UI线程上执行一个方法来正确地更新UI。

如何正确完成此操作?

我对线程的简单代码:

Thread t = new Thread(new ThreadStart(GetAppUpdates));
t.Start();

现在我需要知道线程何时完成,但我觉得我不想实现会不断检查线程状态的代码,因为它会导致UI延迟。

(我知道这对后台工作者来说比较容易,但是我不希望这个过程有一个后台工作者,因为这个Thread不能是后台的。)

有没有办法在Thread对象完成时触发事件?完成ThreadFinished()事件的最佳方法是什么?我有在线程成功完成后必须在主UI上执行的代码。

2 个答案:

答案 0 :(得分:4)

传递新的匿名方法,该方法调用GetAppUpdates()和其他一些方法,通知您完成更新:

Thread t = new Thread(new ThreadStart(() => { GetAppUpdates(); Completed(); }));
t.Start();
在您的Completed方法执行后,将调用

GetAppUpdates()方法:

private void Completed()
{
   if (InvokeRequired)
   {
      Invoke((MethodInvoker)delegate() { Completed(); });
      return;
   }

   // update UI
}

BTW 这将完成这项工作,但我最好使用BackgroundWorker - 它专为此类任务而设计,它的RunWorkerCompleted事件处理程序将在UI线程上运行,这非常方便。 / p>

答案 1 :(得分:0)

我建议使用Task而不是线程来写这个。由于您在完成时更新了UI,因此需要确保它在UI线程中运行。这可以通过 continuation

完成
Task task = Task.Factory.StartNew(() => GetAppUpdates());
task.ContinueWith(t => UpdateUserInterface(),
                     TaskScheduler.FromCurrentSynchronizationContext());