主线程完成后,子线程无法正常工作

时间:2018-02-26 06:34:23

标签: c# multithreading background-thread

我正在开发一个应用程序,从不同的线程中侦听队列,但我遇到了有关线程管理的问题。我从我的主应用程序中启动了一个后台线程。它工作正常,但在主应用程序完成后,然后子线程杀死。主要应用程序完成后还有继续子线程。

我启动如下的线程。

Thread myNewThread = new Thread(() => Executer.ProcessQueueMessages());
myNewThread.IsBackground = true;
myNewThread.Start();

3 个答案:

答案 0 :(得分:2)

正如其他人在评论中所说,但决定不提供完整答案,后台线程在父线程终止后不会继续运行。

如果您希望此线程继续运行,则需要将其设置为前台线程。

此来源:http://www.c-sharpcorner.com/UploadFile/ff0d0f/working-of-thread-and-foreground-background-thread-in-C-Sharp730/

很好地解释了差异并举例说明。取自这种状态的摘录;

  

在C#中,有以下两种线程。

     
      
  1. 前景线程
  2.   
  3. 背景线程
  4.         

    前景线程

         

    前台线程是那些即使在之后也能继续运行的线程   申请退出或退出。它有能力阻止电流   来自终止的申请。 CLR不会关闭   应用程序,直到所有前台线程停止。

         

    后台主题

         

    后台线程是那些将在我们的主要时退出的线程   申请退出。简而言之,如果我们的主要应用程序退出,那么   后台线程也将退出。后台线程是由视图   CLR以及所有前台线程是否已终止,任何和所有   后台线程在应用程序时自动停止   退出。默认情况下,我们创建的每个线程都是Foreground Thread。

答案 1 :(得分:0)

当进程退出时,O / S会清除所有打开的句柄,正在运行的线程以及任何其他锁定的资源。如果它没有做到这一点,那么如果一个过程行为不当,就很难对系统进行纠正。所以你所要求的是不可能的。

如果您要执行长时间运行的作业,并且希望在退出程序之前确保它已完成,则最常见的方法是在退出之前返回任务并等待它,例如,开始任务这样做:

var task = Task.Run( () => DoSomethingThatTakesALongTime() );

并确保完成此操作:

await task;

或者这个:

task.GetAwaiter().GetResult();

答案 2 :(得分:0)

您可以使用Join()使当前线程等待子线程(myNewThread)完成。

Thread myNewThread = new Thread(() => Executer.ProcessQueueMessages());
myNewThread.IsBackground = true;
myNewThread.Start();
myNewThread.join()