我正在设计一个多线程进程,我创建一个线程来进行一些处理,以便不锁定UI。但是,当这个线程完成时(如果它成功完成没有错误)我需要一个事件,所以我可以在UI线程上执行一个方法来正确地更新UI。
如何正确完成此操作?
我对线程的简单代码:
Thread t = new Thread(new ThreadStart(GetAppUpdates));
t.Start();
现在我需要知道线程何时完成,但我觉得我不想实现会不断检查线程状态的代码,因为它会导致UI延迟。
(我知道这对后台工作者来说比较容易,但是我不希望这个过程有一个后台工作者,因为这个Thread不能是后台的。)
有没有办法在Thread对象完成时触发事件?完成ThreadFinished()事件的最佳方法是什么?我有在线程成功完成后必须在主UI上执行的代码。
答案 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());