线程池默认是后台线程,也就是说,它不能维持进程
现有如下代码:
static void Main()
{
ThreadPool.QueueUserWorkItem(item =>
{
for (int i = 1; i <= 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});
}很显然,该程序并不能输出1到20的数,因为主线程结束后,线程池就被迫终止了。
现将代码改写如下:
static void Main()
{
ThreadPool.QueueUserWorkItem(item =>
{
Thread.CurrentThread.IsBackground = false;
Console.WriteLine(Thread.CurrentThread.IsBackground);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});
}手动将线程设置成前台线程,如果是F5运行的话,可以输出1到20的数,但是如果双击exe文件则不能
这也太离谱了吧?
现有如下代码:
static void Main()
{
ThreadPool.QueueUserWorkItem(item =>
{
for (int i = 1; i <= 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});
}很显然,该程序并不能输出1到20的数,因为主线程结束后,线程池就被迫终止了。
现将代码改写如下:
static void Main()
{
ThreadPool.QueueUserWorkItem(item =>
{
Thread.CurrentThread.IsBackground = false;
Console.WriteLine(Thread.CurrentThread.IsBackground);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});
}手动将线程设置成前台线程,如果是F5运行的话,可以输出1到20的数,但是如果双击exe文件则不能
这也太离谱了吧?
也就是已经是前台线程了,理因能够维持进程的
{ System.Threading.Thread.CurrentThread.Abort(); Console.Read();
}
{
for (int i = 1; i <= 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});
为 后台线程
{
Thread.CurrentThread.IsBackground = false; Console.WriteLine(Thread.CurrentThread.IsBackground);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});你说的两种情况我太清楚了:1.线程池线程是后台线程 2.后台线程无法维持进程但是请你看清楚,我已经手动把该线程改为前台线程了(Console.WriteLine显示出来也表明的确是前台线程了
{
Thread.CurrentThread.IsBackground = false; Console.WriteLine(Thread.CurrentThread.IsBackground);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
}); 你说的两种情况我太清楚了:1.线程池线程是后台线程 2.后台线程无法维持进程 但是请你看清楚,我已经手动把该线程改为前台线程了(Console.WriteLine显示出来也表明的确是前台线程了
static void Main()
{
ThreadPool.QueueUserWorkItem(item =>
{
Thread.CurrentThread.IsBackground = false;
Console.WriteLine(Thread.CurrentThread.IsBackground);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});
Thread.Sleep(300);
//Console.ReadLine();
}
楼上的,你这不是问题所在,你没仔细看我的贴:手动将线程设置成前台线程,如果是F5运行的话,可以输出1到20的数,但是如果双击exe文件则不能
这也太离谱了吧?我本来就是在Thread.CurrentThread.IsBackground=false;被执行的前提下说的,你没出问题,那是因为你是F5运行的,你直接双击exe试试怎么大家回贴都不看贴啊,有点郁闷了...
{
ThreadPool.QueueUserWorkItem(item =>
{
Thread.CurrentThread.IsBackground = false;
//控制台已经显示下面的输出了,所以证明已被执行,而且是false,证明是前台线程
Console.WriteLine(Thread.CurrentThread.IsBackground);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});
Thread.Sleep(300);
}
这下你满意了吧?
主线程终止就终止呗,只要有前台线程,进程就不会终止
你开一个普通的Thread,设置为前台线程,你看主线程终止了,它会不会终止 .......
对..vshost.exe 还有别的.static void Main()
{
ThreadPool.QueueUserWorkItem(item =>
{
Thread.CurrentThread.IsBackground = false;
Console.WriteLine(Thread.CurrentThread.IsBackground);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
Thread.Sleep(300);
}
});
}
执行到 Main()方法的时候 就没有前台线程了... 进程结束..
Thread.CurrentThread.IsBackground = false; 是在进程准备结束 后执行的.
即使加了
F5 启动的是 ???.vshost.exe 起码有一个前台线程..不是你控制的.
不想写代码 可以在任务管理器里查看.