【发布时间】:2013-11-25 20:15:34
【问题描述】:
我有一个庞大的集合,我必须在其中执行特定任务(这涉及调用 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 个线程。 谁能建议哪个选项更好?
附: 我知道 .Net 框架会进行线程池,我们不需要控制线程的数量,但由于某些设计决定我们想要使用它。
提前致谢, 罗希特
【问题讨论】:
标签: c# multithreading