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

时间:2013-11-24 16:08:59

标签: c# multithreading

我有一个巨大的集合,我必须执行一个特定的任务(涉及调用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个线程。 任何人都可以建议哪个选项更好?

P.S。 我理解.Net框架确实有线程池,我们不需要控制线程数,但由于一些设计决定,我们想要使用它。

先谢谢, 罗希特夏尔

2 个答案:

答案 0 :(得分:1)

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

我认为你想要最快的方法。要查看哪个更好,请在目标环境中运行(或者您可以获得最接近的近似值)并查看哪个最快完成。

答案 1 :(得分:1)

  

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

如果您将this callParallelOptions对象一起使用,则可以控制Parallel.ForEach中的线索数量:

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