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

标签 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 个对象,据我所知,选项 1 将启动 4 个线程,每个具有 4 个对象的线程将被同步处理。 选项 2 将启动 4 个线程,每个线程 1 个对象,处理它们,然后再次启动 4 个线程。 谁能建议哪个选项更好?

附注 我了解 .Net 框架确实有线程池,我们不需要控制线程数量,但由于某些设计决策,我们想要使用它。

提前致谢, 罗希特

最佳答案

I want to control the number of threads instead of using Parallel.ForEach directly

如果您使用this call,您可以控制Parallel.ForEach中的线程数量。与 ParallelOptions对象:

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

关于c# - 使用 AsParallel 或 Parallel.ForEach 控制线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20176702/

相关文章:

c# - 什么是好的唯一 PC 标识符?

c# - 当操作执行到Task中时,如何通过UI线程调用事件处理程序? (C#)

c - 为什么要使用pthread_exit?

python - UDP 服务器线程化

c# - 我数据库中的所有数据都是更新的。如何只更新 1 行?

c# - 继承与收藏

c# - 函数运行时用于显示图片的线程

java - 在这种情况下,同步语句如何工作?

c# - NHibernate hql 元组结果

C# 远程调试器 - 无法找到或打开 PDB 文件