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

标签 c# multithreading

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

我怎样才能正确地完成这个?

我的线程的简单代码:

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

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

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

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

最佳答案

传递新的匿名方法,该方法调用 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 线程上运行,这非常方便。

关于c# - 多线程问题 - 线程完成后需要事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13850247/

相关文章:

java - 为什么 java ExecutorService execute 接受一个新的 Runnable 实现

c++ - rusage 进程/线程的 Cpu 时间不可能

java - 如何在java中对硬盘驱动器的文件读/写进行排队?

C# 泛型继承数据访问

c# - 以编程方式选中 DataGridView 中的复选框

c# - MSDN 提供的 Equals 覆盖中的奇怪转换

c# - 在 InputField 中检测复制和粘贴

c# - 在 XMP dc :Subject field 中存储数组

java - 同步之前更新内存?

c++ - 传递字符串作为线程启动例程参数 : C++