这是我正在测试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号线
答案 0 :(得分:1)
您没有使用线程池,而是启动不受线程池管理的新线程。要启动ThreadPool线程,可以使用ThreadPool.QueueUserWorkItem方法。
ThreadPool.SetMaxThreads方法的参数无效,因此该方法返回false,表示更改不成功。
您不能将最大工作线程数或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);
}
}