线程池默认是后台线程,也就是说,它不能维持进程
现有如下代码:
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文件则不能
这也太离谱了吧?

解决方案 »

  1.   

    进程没了... 最后加个  Console.Read();  
      

  2.   

    你看清楚,我已经Thread.CurrentThread.IsBackground = false;了
    也就是已经是前台线程了,理因能够维持进程的
      

  3.   

     static void Main(string[] args)
            {            System.Threading.Thread.CurrentThread.Abort();            Console.Read();
            }
      

  4.   

    ThreadPool.QueueUserWorkItem(item =>
                {
                    for (int i = 1; i <= 20; i++)
                    {
                        Console.WriteLine(i);
                        Thread.Sleep(300);
                    }
                });
    为 后台线程
      

  5.   

    ....................老大,你也是C#版的老人了,麻烦你看清楚啊前台线程和后台线程的区别我当然非常清楚,你看清楚我的问题: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);
                    }
                });你说的两种情况我太清楚了:1.线程池线程是后台线程 2.后台线程无法维持进程但是请你看清楚,我已经手动把该线程改为前台线程了(Console.WriteLine显示出来也表明的确是前台线程了
      

  6.   

    老大,你也是C#版的老人了,麻烦你看清楚啊 前台线程和后台线程的区别我当然非常清楚,你看清楚我的问题: 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); 
                    } 
                }); 你说的两种情况我太清楚了:1.线程池线程是后台线程 2.后台线程无法维持进程 但是请你看清楚,我已经手动把该线程改为前台线程了(Console.WriteLine显示出来也表明的确是前台线程了
      

  7.   

    原则上,加了Thread.CurrentThread.IsBackground = false;这个命令也不能有效地将线程设置成前台线程。因为这个命令根本没有执行的机会。当Main结束的时候,主线程就结束了,新建的线程根本没有开始执行,就会被销毁。我在Main后面追加了一个Sleep命令,将主线程结束的时间延迟了一点,并允许系统调度其他线程,就可以了
    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();
    }
      

  8.   


    楼上的,你这不是问题所在,你没仔细看我的贴:手动将线程设置成前台线程,如果是F5运行的话,可以输出1到20的数,但是如果双击exe文件则不能 
    这也太离谱了吧?
    我本来就是在Thread.CurrentThread.IsBackground=false;被执行的前提下说的,你没出问题,那是因为你是F5运行的,你直接双击exe试试怎么大家回贴都不看贴啊,有点郁闷了...
      

  9.   

    Thread.CurrentThread.IsBackground = false;在运行的时候即使执行 Thread.CurrentThread.IsBackground 你的前台进程已经开始结束了.
              
      

  10.   

    static void Main()
    {
    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);
    }
    这下你满意了吧?
      

  11.   

    现在的问题是:F5运行的话,可以输出1到20的数,但是如果双击exe文件则不能(或者Ctrl+F5)
      

  12.   

    调试是 vshost.exe  启动后 Console加本身的线程 要+3个线程  你主线程OUT了不是所有线程序就结束了啊双击是 exe          启动后就2个线程...
      

  13.   

    你自己都迷糊了?
    主线程终止就终止呗,只要有前台线程,进程就不会终止
    你开一个普通的Thread,设置为前台线程,你看主线程终止了,它会不会终止 .......
      

  14.   

    主线程终止就终止呗,只要有前台线程,进程就不会终止 
    对..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  起码有一个前台线程..不是你控制的.
    不想写代码 可以在任务管理器里查看.