首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子线程在主线程完成后不工作

子线程在主线程完成后不工作
EN

Stack Overflow用户
提问于 2018-02-26 06:34:23
回答 3查看 3.5K关注 0票数 2

我正在开发一个应用程序,它可以侦听来自不同线程的队列,但我在线程管理方面遇到了问题。我从我的主应用程序启动了一个后台线程。它工作很好,但是在主应用程序完成后,子线程就会死掉。主应用程序完成后,是否仍然要继续执行子线程。

我开始像下面这样的线程。

代码语言:javascript
复制
Thread myNewThread = new Thread(() => Executer.ProcessQueueMessages());
myNewThread.IsBackground = true;
myNewThread.Start();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-26 06:53:04

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

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

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

很好地解释了两者的区别,并给出了例子。从这些状态中摘录出来的;

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

  1. 前景螺纹
  2. 背景螺纹

前台线程

前台线程是那些即使在应用程序退出或退出之后仍继续运行的线程。它能够防止当前应用程序终止。在所有前台线程停止之前,CLR不会关闭应用程序。

背景线程

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

票数 5
EN

Stack Overflow用户

发布于 2018-02-26 06:53:39

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

如果您有一个长期运行的作业要执行,并且您想确保它在退出程序之前已经完成,最常见的方法是返回一个任务,然后等待它退出,例如启动任务:

代码语言:javascript
复制
var task = Task.Run( () => DoSomethingThatTakesALongTime() );

为确保它完成,请执行以下操作:

代码语言:javascript
复制
await task;

或者这个:

代码语言:javascript
复制
task.GetAwaiter().GetResult();
票数 1
EN

Stack Overflow用户

发布于 2019-04-09 21:04:09

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

代码语言:javascript
复制
Thread myNewThread = new Thread(() => Executer.ProcessQueueMessages());
myNewThread.IsBackground = true;
myNewThread.Start();
myNewThread.join()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48982697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档