繁体   English   中英

使用AsParallel或Parallel.ForEach控制线程数

[英]Controlling number of threads using AsParallel or Parallel.ForEach

我有一个庞大的集合,在这个集合上,我必须执行特定的任务(这涉及调用wcf服务)。 我想控制线程数,而不是直接使用Parallel.ForEach。 在这里,我有2个选项:我正在使用以下分区数据:

List<MyCollectionObject> MyCollection = new List<MyCollectionObject>();
 public static IEnumerable<List<T>> PartitionMyData<T>(this IList<T> source, Int32 size)
        {
            for (int i = 0; i < Math.Ceiling(source.Count / (Double)size); i++)
            {
                yield return new List<T>(source.Skip(size * i).Take(size));
            }
        }

选项1:

MyCollection.PartitionMyData(AutoEnrollRequests.Count()/threadValue).AsParallel().AsOrdered()
                                        .Select(no => InvokeTask(no)).ToArray();

 private void InvokeTask(List<MyCollectionObject> requests)
{
   foreach(MyCollectionObject obj in requests)
  {
    //Do Something
  }
}

选项2:

MyCollection.PartitionMyData(threadValue).AsOrdered()
                                        .Select(no => InvokeTask(no)).ToArray();

private void InvokeTask(List<MyCollectionObject> requests)
{
    Action<MyCollectionObject> dosomething = 
    {
    }
    Parallel.ForEach(requests,dosomething)
}

如果我的集合中有16个对象,据我所知,Option1将启动4个线程,每个具有4个对象的线程将被同步处理。 选项2将启动4个线程,每个线程带有1个对象,对其进行处理,然后再次启动4个线程。 谁能建议哪个选项更好?

PS我知道.Net框架可以进行线程池化,我们不需要控制线程数,但是由于某些设计决策,我们希望使用它。

在此先感谢,罗希特

在这里不可能给出A或B答案。 这取决于太多的未知数。

我假设您想要最快的方法。 要查看哪种更好,请在目标环境上运行(或获得最接近的近似值),并查看完成最快的一个。

我想控制线程数,而不是直接使用Parallel.ForEach

如果将此调用ParallelOptions对象一起使用,则可以控制Parallel.ForEach的线程数:

Parallel.ForEach(requests,
                 new ParallelOptions(){MaxDegreeOfParallelism = 4}, //change here
                 dosomething)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM