1

我正在使用 Threadpool 在 c# .NET 2.0 中进行一些并行处理。

代码 :

int MAXThreads=GetConfigValue("MaxThreadLimit"); //This value is read from app.config

ManualResetEvent[] doneEvents=new ManualResetEvent[MAXThreads];
for(int i=0;i<MaxThreads,i++)
{

doneEvents[i]=new ManualResetEvent(false);

//create workload
DoProcess job=new DoProcess(workload,doneEvents[i]);
ThreadPool.QueueUserWorkItem(job.ThreadPoolCallBack,i);

}
WaitHandle.WaitAll(doneEvents);

//proceed

Class DoProcess
{
private WorkLoad load;
private ManualResetEvent doneEvent;
public DoProcess(WorkLoad load,ManualResetEvent doneEvent)
{
this.load=load;
this.doneEvent=doneEvent;
}
public void ThreadPoolCallBack(object index)
{
//Do Processing
doneEvent.Set();
}
}

MAXThreads 值正在从配置中读取,但我想这与生成的实际线程数无关。只有少数约 4-5 个线程处理所有工作负载。我希望线程数固定在 20 左右。我怎样才能做到这一点?我错过了什么吗?..SetMaxThreads 解决了这个问题吗?..上面的代码将在四核 cpu 上运行。

4

3 回答 3

3

您必须改为设置最小线程数。

一般来说,这不是一个好主意,运行比处理器内核更多的线程通常会完成更少的工作,因为操作系统会花时间将它们换入和换出。这些上下文切换并不便宜。线程池管理器尽最大努力将活动线程数限制为核心数。仅当现有线程未及时完成时才允许运行更多线程。最多线程数。默认情况下是一个巨大的值,在您的情况下为 1000。

仅当这些工作线程由于过于频繁地被 I/O 阻塞而没有执行足够的工作时才增加最小线程数。在这种情况下,您真的应该考虑 Thread 对象而不是线程池线程。

于 2012-05-19T14:26:40.797 回答
0

班上也SetMinThreadsThreadPool。将 min 和 max 设置为相同的值“应该”修复线程数,但实际上发生在幕后的是任何人的猜测。

MSDN

线程池按需提供新的工作线程或 I/O 完成线程,直到达到每个类别的最小值。

因此,将最小线程数设置为 20 应该会在池中为您提供不少于 20 个线程。

于 2012-05-19T14:18:26.740 回答
0

假设这是一个 C# 应用程序,您可以使用 .NET Framework 4 的并行编程模型并将线程限制为 20。

Parallel.For(0, n, new ParallelOptions { MaxDegreeOfParallelism = 20 }, 
  i => 
  { 
    DoWork(i);
  }); 

但是,如果这是一个网站/应用程序,最好一起远离 ThreadPool,除了非常小的工作,1-2 个线程,因为你不想饿死 ThreadPool。并且永远不要在代码中设置最大或最小线程,因为它会影响您的整个站点,以及使用相同线程池的所有其他站点。

在这种情况下,我建议改用SmartThreadPool

于 2012-05-19T14:05:52.183 回答