3

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

我怎样才能正确地做到这一点?

我的线程简单代码:

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

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

(我知道使用 backgroundworker 会更容易,但我不希望这个进程使用 backgroundworker,因为这个线程不能是后台)。

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

4

2 回答 2

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
}

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

于 2012-12-12T23:10:28.910 回答
0

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

Task task = Task.Factory.StartNew(() => GetAppUpdates());
task.ContinueWith(t => UpdateUserInterface(),
                     TaskScheduler.FromCurrentSynchronizationContext());
于 2012-12-12T23:13:55.833 回答