【问题标题】:Child Thread not working after main thread finishes主线程完成后子线程不起作用
【发布时间】:2018-02-26 06:34:23
【问题描述】:

我正在开发一个应用程序,它从不同的线程监听队列,但我遇到了线程管理问题。我从我的主应用程序启动了一个后台线程。它工作正常,但在主应用程序完成后,子线程就会终止。主应用程序完成后是否有继续子线程。

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

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

【问题讨论】:

  • 不,没有这样的方法。您可以使线程成为非后台线程,它会在主线程完成后继续工作 - 但是您的主应用程序进程将不会真正完成。
  • 一旦主线程被杀死,所有的子线程都会被杀死。在杀死主线程之前,您必须等待所有子线程完成。

标签: c# multithreading background-thread


【解决方案1】:

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

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

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

很好地解释了差异并举例说明。摘自该州;

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

  1. 前台线程
  2. 后台线程

前台线程

前台线程是那些即使在 应用程序退出或退出。它具有防止电流的能力 应用程序从终止。 CLR 不会关闭 应用程序,直到所有前台线程都停止。

后台线程

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

【讨论】:

    【解决方案2】:

    当进程退出时,O/S 会清理所有打开的句柄、正在运行的线程和任何其他锁定的资源。如果它不这样做,那么如果进程行为不端,就很难纠正系统。所以你问的是不可能的。

    如果你有一个长时间运行的作业要执行,并且你想确保它在退出程序之前完成,最常见的方法是返回一个任务并在退出之前等待它,例如要启动任务,请执行以下操作:

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

    并确保它完成这样做:

    await task;
    

    或者这个:

    task.GetAwaiter().GetResult();
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 2018-03-29
        • 2022-01-02
        • 2017-07-19
        • 2015-03-25
        相关资源
        最近更新 更多