我正在开发一个应用程序,它可以侦听来自不同线程的队列,但我在线程管理方面遇到了问题。我从我的主应用程序启动了一个后台线程。它工作很好,但是在主应用程序完成后,子线程就会死掉。主应用程序完成后,是否仍然要继续执行子线程。
我开始像下面这样的线程。
Thread myNewThread = new Thread(() => Executer.ProcessQueueMessages());
myNewThread.IsBackground = true;
myNewThread.Start();发布于 2018-02-26 06:53:04
正如其他人在评论中所说的,但决定不提供完整的答案,后台线程在父线程终止后不会继续运行。
如果希望此线程继续运行,则需要将其设置为前台线程。
来源:http://www.c-sharpcorner.com/UploadFile/ff0d0f/working-of-thread-and-foreground-background-thread-in-C-Sharp730/
很好地解释了两者的区别,并给出了例子。从这些状态中摘录出来的;
在C#中有以下两种线程。
前台线程
前台线程是那些即使在应用程序退出或退出之后仍继续运行的线程。它能够防止当前应用程序终止。在所有前台线程停止之前,CLR不会关闭应用程序。
背景线程
后台线程是那些如果我们的主应用程序退出就会退出的线程。简而言之,如果我们的主要应用程序退出,后台线程也会退出。后台线程是CLR的视图,如果所有前台线程都已终止,则在应用程序退出时将自动停止任何和所有后台线程。默认情况下,我们创建的每个线程都是前台线程。
发布于 2018-02-26 06:53:39
当进程退出时,O/S将清除所有打开的句柄、正在运行的线程和任何其他锁定的资源。如果没有这样做,如果一个进程行为不当,就很难纠正系统。所以你要求的是不可能的。
如果您有一个长期运行的作业要执行,并且您想确保它在退出程序之前已经完成,最常见的方法是返回一个任务,然后等待它退出,例如启动任务:
var task = Task.Run( () => DoSomethingThatTakesALongTime() );为确保它完成,请执行以下操作:
await task;或者这个:
task.GetAwaiter().GetResult();发布于 2019-04-09 21:04:09
您可以使用Join()使当前线程等待子线程(myNewThread)完成。
Thread myNewThread = new Thread(() => Executer.ProcessQueueMessages());
myNewThread.IsBackground = true;
myNewThread.Start();
myNewThread.join()https://stackoverflow.com/questions/48982697
复制相似问题