Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中,终止进程后非后台线程真的会继续运行吗_C#_.net_Multithreading - Fatal编程技术网

C# 在.NET中,终止进程后非后台线程真的会继续运行吗

C# 在.NET中,终止进程后非后台线程真的会继续运行吗,c#,.net,multithreading,C#,.net,Multithreading,我正在尝试学习C#threading,有人提醒我,非后台线程和未显式终止的线程将继续运行,并阻止应用程序终止。为了测试这一点,我编写了一个快速的C#控制台应用程序。该程序包含一个具有无限循环的方法。无限循环方法在自己的线程中从Main调用,并且从不显式终止。我还验证了IsBackground属性是否设置为false。因此,当我试图通过单击console窗口上的“X”来终止console应用程序时,我预计程序会挂起,但它没有挂起。另外,在应用程序运行并查看任务管理器时,我看到应用程序具有8个线程。

我正在尝试学习C#threading,有人提醒我,非后台线程和未显式终止的线程将继续运行,并阻止应用程序终止。为了测试这一点,我编写了一个快速的C#控制台应用程序。该程序包含一个具有无限循环的方法。无限循环方法在自己的线程中从Main调用,并且从不显式终止。我还验证了IsBackground属性是否设置为false。因此,当我试图通过单击console窗口上的“X”来终止console应用程序时,我预计程序会挂起,但它没有挂起。另外,在应用程序运行并查看任务管理器时,我看到应用程序具有8个线程。当我通过单击“X”关闭程序时,它不再位于Task Manger进程选项卡中,并且我没有看到任何明显属于应用程序的线程仍在进程选项卡中运行。所以有两个问题: 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();        
    }
}

不,非后台线程不会阻止进程被强制终止。相反,更重要的是,当运行的线程只有后台线程时,CLR将终止进程本身

因此,非后台线程将在正常情况下保持CLR运行,但它们没有任何防止进程关闭的超级能力

  • 不,进程退出后,无限循环线程没有继续运行。当进程退出时,其所有线程也会终止执行。如果没有线程所属的进程,您不会期望在任务管理器中看到线程。由于进程已退出,因此任务管理器中没有条目,也没有关联的线程
  • 您应该看到主线程、工作线程、垃圾收集器线程和终结器线程。由于您使用的是控制台,因此您还将有IO完成端口的池线程。如果您看到的不止这些,那么其他线程都与调试器相关

  • 每个帖子只问一个问题是值得的。关于运行8个线程的第二部分实际上是一个实现细节-可能会运行额外线程的原因有很多,例如垃圾收集或线程池。无法确认8个线程。在我的机器上使用无数线程的唯一东西是Firefox进程中可能存在(通过)线程的重复。如果进程结束了,那么所有线程也都结束了。将进程视为线程的容器。并将线程视为无法在创建它们的容器之外生存的东西。