2 回答

TA贡献1868条经验 获得超4个赞
您应该测试以下的返回值:
ThreadPool.SetMaxThreads(3, 0); //returns false on normal machines.
由于以下原因,它无法处理更改:
您不能将工作线程或 I/O 完成线程的最大数量设置为小于计算机上处理器数量的数字。要确定存在多少处理器,请检索 Environment.ProcessorCount 属性的值。此外,您不能将工作线程或 I/O 完成线程的最大数量设置为小于相应的工作线程或 I/O 完成线程的最小数量。要确定最小线程池大小,请调用 GetMinThreads 方法。
参见:MSDN
所以,你可以做的是这样的;
ThreadPool.SetMaxThreads(16, 16);
但我假设你试图降低ThreadPool
. 一般来说,这不是一个好主意。对于这种逻辑,您将需要一个替代方案。
信号量可能是一个选项,如此处所述,或者@Fildor 描述的模式。

TA贡献1815条经验 获得超10个赞
您不能限制线程池,但为什么不在启动新线程之前检查一个简单的增量/减量计数器呢?
在伪代码中-
volatile int currentThreadCount = 0;
void myWorkLauncher()
{
while(<I have work to do>)
{
if(currentThreadCount < threshold)
{
currentThreadCount ++;
ThreadPool.QueueUserWorkItem(workerFunc);
}
else
{
Thread.Sleep(500);
}
}
Thread.Sleep(500);
}
工作函数的最后一行只是递减值。
你可以做各种花哨的事情,比如将你的 workerFunc 包装在一个 Action() 中,它本身会减少计数器,防止你的 workerFunc 需要与 myWorkLauncher 类的任何连接。或者,您可以将简单的 Thread.Sleep 替换为 AutoResetEvent 或类似的。
- 2 回答
- 0 关注
- 354 浏览
添加回答
举报