在.NET中,在终止进程后,非背景线程确实会继续运行

时间:2018-04-04 16:40:47

标签: c# .net multithreading

我正在尝试学习C#线程,并且我已经注意到,非后台且未明确终止的线程将继续运行,并阻止您的应用程序终止。为了测试这个,我写了一个快速的C#控制台应用程序该程序包含一个无限循环的方法。无限循环方法在Main自己的线程中调用,永远不会被显式终止。我还验证 IsBackground 属性设置为 false 。所以我希望当我尝试通过单击控制台窗口上的“X”来终止控制台应用程序时,该程序将挂起,而不是。在应用程序运行并查看任务管理器的同时,我看到了8个线程的应用程序。当我通过单击“X”关闭程序时,它不再位于“任务管理器进程”选项卡中,并且我看不到任何明显属于仍在进程选项卡中运行的应用程序的线程。所以有两个问题: 1.关闭应用程序后,该无限循环线程是否仍在运行,为什么我不在“任务管理器”中看到它们? 2.另外,为什么我会在“任务管理器”中看到8个线程在该进程中运行,而我只期望2个。

    class Program
    {
    static string backgroundsetting;

    public static void looper()
    {
        int i = 0;
        while (true)
        {
            Console.WriteLine(" looper int i = {0}", i);
            Console.WriteLine("Thread background property is ...." + backgroundsetting);
            i++;

        }
    }

    static void Main(string[] args)
    {
        Thread loopyThread = new Thread(looper);
        backgroundsetting = loopyThread.IsBackground.ToString();
        loopyThread.Start();        
    }
}

2 个答案:

答案 0 :(得分:2)

不,非后台线程不会阻止进程被强行终止。相反,当运行的唯一线程是后台线程时,CLR将终止进程本身

因此非后台线程将使CLR在正常情况下保持运行,但它们没有任何超级权限来阻止进程关闭。

答案 1 :(得分:1)

  1. 不,您的无限循环线程在您的进程退出后仍未运行。当进程退出所有线程时也终止执行。如果没有它们所属的进程,您不会期望在任务管理器中看到线程。由于进程已退出,因此任务管理器中没有条目,也没有关联的线程。
  2. 您应该看到主线程,工作线程,垃圾收集器线程和终结器线程。您还将为IO Completion端口提供池化线程,因为您正在使用控制台。如果您看到的不止于此,则其他线程与调试器相关。