C#多线程-限制并发线程的数量

C#多线程-限制并发线程的数量,c#,multithreading,C#,Multithreading,我对控制要运行的并发线程的数量有疑问。让我解释一下我目前的工作:例如 var myItems = getItems(); // is just some generic list // cycle through the mails, picking 10 at a time int index = 0; int itemsToTake = myItems.Count >= 10 ? 10 : myItems.Count; while (index < myItems.C

我对控制要运行的并发线程的数量有疑问。让我解释一下我目前的工作:例如

 var myItems = getItems(); // is just some generic list

 // cycle through the mails, picking 10 at a time
 int index = 0;
 int itemsToTake = myItems.Count >= 10 ? 10 : myItems.Count;
 while (index < myItems.Count)
 {
     var itemRange = myItems.GetRange(index, itemsToTake);
     AutoResetEvent[] handles = new AutoResetEvent[itemsToTake];

     for (int i = 0; i < itemRange.Count; i++)
     {
         var item = itemRange[i];
         handles[i] = new AutoResetEvent(false);

         // set up the thread
         ThreadPool.QueueUserWorkItem(processItems, new Item_Thread(handles[i], item));
     }

    // wait for all the threads to finish
    WaitHandle.WaitAll(handles);

    // update the index
    index += itemsToTake;
    // make sure that the next batch of items to get is within range
    itemsToTake = (itemsToTake + index < myItems.Count) ? itemsToTake : myItems.Count -index;
var myItems=getItems();//只是一些通用的列表
//循环浏览邮件,每次挑选10封
int指数=0;
int itemsToTake=myItems.Count>=10?10:myItems。计数;
while(索引
这是我目前采用的路径。但是我一点也不喜欢它。我知道我可以“管理”线程池本身,但我听说这样做是不可取的。那么,还有什么选择呢?信号量类


谢谢。

虽然我没有测试过,但看起来您可以控制使用的最大线程数。

虽然我没有测试过,但看起来您可以控制使用的最大线程数。

您可以使用ThreadPool.SetMaxThreads方法


您可以使用ThreadPool.SetMaxThreads方法


不要使用treadpool,再找一个(只要看看谷歌,已经有六个实现了),然后自己管理


管理treadpool是不可取的,因为很多内部工作可能会用到它,管理您自己的threadpool实例是完全可以的。

不要使用treadpool,找另一个(只需看看google,有六个实现)并自己管理它

管理treadpool是不可取的,因为许多内部工作可能会用到它,管理您自己的线程池实例是完全可以的。

在中,提到了
SetMaxThreads

public static bool SetMaxThreads (
int workerThreads,
int completionPortThreads
)
设置可同时处于活动状态的对线程池的请求数。在线程池线程可用之前,超过该数目的所有请求都将保持排队状态

然而:

不能将工作线程数或I/O完成线程数设置为小于计算机中处理器数的数

但我想使用非单线程池对您的服务会更好。

中提到了
SetMaxThreads

public static bool SetMaxThreads (
int workerThreads,
int completionPortThreads
)
设置可同时处于活动状态的对线程池的请求数。在线程池线程可用之前,超过该数目的所有请求都将保持排队状态

然而:

不能将工作线程数或I/O完成线程数设置为小于计算机中处理器数的数

但我想使用非单例线程池会更好地为您服务。

假设问题是“如何限制工作线程的数量?”答案是使用生产者-消费者队列,您可以在其中控制工作线程的数量。只需将您的项排队,让它处理工作线程即可

是您可以使用的通用实现。

假设问题是“如何限制工作线程的数量?”答案将是使用生产者-消费者队列,您可以在其中控制工作线程的数量。只需对项目进行排队,然后让它处理工作线程即可


是可以使用的通用实现。

而不是直接使用<代码>线程池> />代码>,您也可以考虑使用TPL或PLIQ。例如,使用PLIQ,您可以这样做:

getItems().AsParallel()
          .WithDegreeOfParallelism(numberOfThreadsYouWant)
          .ForAll(item => process(item));
或使用
并行

var options = new ParallelOptions {MaxDegreeOfParallelism = numberOfThreadsYouWant};
Parallel.ForEach(getItems, options, item => process(item));

请确保指定并行度确实可以提高应用程序的性能。默认情况下,TPL和PLINQ使用ThreadPool,这在管理正在运行的线程数量方面做得非常好。在.NET 4中,ThreadPool实现的算法仅在提高性能的情况下才添加更多处理线程。

I除了直接使用<代码>线程池> />代码外,您还可以考虑使用TPL或PLIQ。例如,使用PLIQ,您可以这样做:

getItems().AsParallel()
          .WithDegreeOfParallelism(numberOfThreadsYouWant)
          .ForAll(item => process(item));
或使用
并行

var options = new ParallelOptions {MaxDegreeOfParallelism = numberOfThreadsYouWant};
Parallel.ForEach(getItems, options, item => process(item));

确保指定并行度确实可以提高应用程序的性能。默认情况下,TPL和PLINQ使用ThreadPool,这在管理正在运行的线程数量方面做得非常好。在.NET 4中,ThreadPool实现的算法仅在提高性能的情况下才添加更多处理线程。

T这里没有理由处理混合线程同步结构(如AutoResetEvent)和线程池

您可以使用一个类作为协调器,负责异步执行所有代码


使用任务或APM模式包装“Item#U Thread”的功能。然后使用Jeffrey Richter的AsyncCoordinator类(可以在CLR via C#3rd Edition一书中的代码中找到)。

没有理由处理混合线程同步结构(如AutoResetEvent)和线程池

您可以使用一个类作为协调器,负责异步执行所有代码


使用任务或APM模式包装“Item#U Thread”的功能。然后使用Jeffrey Richter的AsyncCoordinator类(可在CLR via C#3rd Edition一书中的代码中找到).

问题是什么?例如,是否要限制可以创建的线程数量?如果是,原因是什么?如果尝试创建更多线程,您希望发生什么?是否要限制