线程池的SetMaxThreads属性似乎没有影响,那为什么它在这里呢?

时间:2017-05-12 06:44:59

标签: .net multithreading msdn

这是我正在测试threadpool.setmaxthreads属性的简单程序,但似乎它确实没有影响

class Program
{
    static void Main(string[] args)
    {
        ThreadPool.SetMaxThreads(2, 0);
        for (int i = 0; i < 5; i++)
        {
            new Thread(Go).Start();
//                Thread.Sleep(20000);
        } 
    }


    static void Go()
    {

        Console.WriteLine("From Thread#"+ Thread.CurrentThread.ManagedThreadId );
        Console.ReadLine();
    }
}

}

输出

  

来自第10号线

     

来自第11号线

     

来自第12号线

     

来自第13号线

     

来自第14号线

1 个答案:

答案 0 :(得分:1)

  1. 您没有使用线程池,而是启动不受线程池管理的新线程。要启动ThreadPool线程,可以使用ThreadPool.QueueUserWorkItem方法。

  2. ThreadPool.SetMaxThreads方法的参数无效,因此该方法返回false,表示更改不成功。

  3. 来自Remarks section

      

    您不能将最大工作线程数或I / O完成线程数设置为小于计算机上处​​理器数的数字。要确定存在多少个处理器,请检索Environment.ProcessorCount属性的值。此外,您不能将最大工作线程数或I / O完成线程数设置为小于相应的最小工作线程数或I / O完成线程数。要确定最小线程池大小,请调用GetMinThreads方法。

    以下是经过修改的演示代码:

    class Program
    {
        static void Main(string[] args)
        {
            int a; int b;
            ThreadPool.GetMinThreads(out a, out b); //a=4, b=4 on my machine
            bool suc = ThreadPool.SetMaxThreads(4, 4);
            for (int i = 0; i < 15; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(
                    (o) =>
                    {
                        Go();
                    }));
            }
            Console.ReadLine();
        }
    
    
        static void Go()
        {
            Console.WriteLine("From Thread#" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(200);
            Console.WriteLine("End Thread#" + Thread.CurrentThread.ManagedThreadId);
        }
    }