C# 在.NET中,终止进程后非后台线程真的会继续运行吗
我正在尝试学习C#threading,有人提醒我,非后台线程和未显式终止的线程将继续运行,并阻止应用程序终止。为了测试这一点,我编写了一个快速的C#控制台应用程序。该程序包含一个具有无限循环的方法。无限循环方法在自己的线程中从Main调用,并且从不显式终止。我还验证了IsBackground属性是否设置为false。因此,当我试图通过单击console窗口上的“X”来终止console应用程序时,我预计程序会挂起,但它没有挂起。另外,在应用程序运行并查看任务管理器时,我看到应用程序具有8个线程。当我通过单击“X”关闭程序时,它不再位于Task Manger进程选项卡中,并且我没有看到任何明显属于应用程序的线程仍在进程选项卡中运行。所以有两个问题: 1.在我关闭应用程序后,无限循环线程是否仍在运行,为什么我在“任务管理器”中看不到它们?2.另外,为什么我看到该进程的“任务管理器”中运行了8个线程,而我预期只有2个C# 在.NET中,终止进程后非后台线程真的会继续运行吗,c#,.net,multithreading,C#,.net,Multithreading,我正在尝试学习C#threading,有人提醒我,非后台线程和未显式终止的线程将继续运行,并阻止应用程序终止。为了测试这一点,我编写了一个快速的C#控制台应用程序。该程序包含一个具有无限循环的方法。无限循环方法在自己的线程中从Main调用,并且从不显式终止。我还验证了IsBackground属性是否设置为false。因此,当我试图通过单击console窗口上的“X”来终止console应用程序时,我预计程序会挂起,但它没有挂起。另外,在应用程序运行并查看任务管理器时,我看到应用程序具有8个线程。
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运行,但它们没有任何防止进程关闭的超级能力
每个帖子只问一个问题是值得的。关于运行8个线程的第二部分实际上是一个实现细节-可能会运行额外线程的原因有很多,例如垃圾收集或线程池。无法确认8个线程。在我的机器上使用无数线程的唯一东西是Firefox进程中可能存在(通过)线程的重复。如果进程结束了,那么所有线程也都结束了。将进程视为线程的容器。并将线程视为无法在创建它们的容器之外生存的东西。