主要线程完成后无法工作



我正在开发一个应用程序,该应用程序,从其他线程中听一个队列,但我对线程管理有问题。我从主要应用程序启动了一个背景线程。它工作正常,但是在主要应用程序完成后,然后将儿童线程杀死。无论如何,在主要应用程序完成后是否可以继续使用子线程。

我启动如下图。

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

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

如果您希望此线程保持运行,则需要将其设置为前景线程。

此来源:http://www.c-sharpcorner.com/uploadfile/ff0d0f/working-of--thread-thread-and-foreground-foreground-foreground-thread-thread-inread-inread-in-c-sharp730/

很好地解释了差异并提供了例子。从此状态获取的摘录;

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

  1. 前景线
  2. 背景线程

前景线程

前景线程是那些即使在 申请退出或退出。它具有防止电流的能力 终止的申请。CLR不会关闭 申请直到所有前景线都停止。

背景线程

背景线程是那些如果我们的主 申请退出。简而言之,如果我们的主要申请退出, 背景线程也将退出。背景线程是视图 CLR,如果所有前景线都终止,则所有和所有 应用程序时,背景线程将自动停止 退出。默认情况下,我们创建的每个线程都是一个前景线程。

当该过程退出时,O/S会清理任何打开的手柄,运行的线程和任何其他锁定资源。如果没有这样做,如果进程行为不佳,将很难纠正系统。因此,您要问的是不可能的。

如果您要执行长期运行的工作,并且要确保在退出程序之前已经完成,则最常见的方法是返回任务并在退出之前等待它,例如开始任务执行此操作:

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

并确保完成此操作:

await task;

或以下:

task.GetAwaiter().GetResult();

您可以使用join((使当前线程等待到子线程(myNewThread(饰面。

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

最新更新