我正在开发一个应用程序,从不同的线程中侦听队列,但我遇到了有关线程管理的问题。我从我的主应用程序中启动了一个后台线程。它工作正常,但在主应用程序完成后,然后子线程杀死。主要应用程序完成后还有继续子线程。
我启动如下的线程。
Thread myNewThread = new Thread(() => Executer.ProcessQueueMessages());
myNewThread.IsBackground = true;
myNewThread.Start();
答案 0 :(得分:2)
正如其他人在评论中所说,但决定不提供完整答案,后台线程在父线程终止后不会继续运行。
如果您希望此线程继续运行,则需要将其设置为前台线程。
很好地解释了差异并举例说明。取自这种状态的摘录;
在C#中,有以下两种线程。
- 前景线程
- 背景线程
醇>前景线程
前台线程是那些即使在之后也能继续运行的线程 申请退出或退出。它有能力阻止电流 来自终止的申请。 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()