我正在尝试学习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();
}
}
答案 0 :(得分:2)
不,非后台线程不会阻止进程被强行终止。相反,当运行的唯一线程是后台线程时,CLR将终止进程本身。
因此非后台线程将使CLR在正常情况下保持运行,但它们没有任何超级权限来阻止进程关闭。
答案 1 :(得分:1)