C#任务工厂

时间:2016-01-07 16:28:57

标签: c# task-parallel-library task

嗨我在for循环中有如下代码。它处于for循环中,因为它需要运行的次数取决于用户添加的项目数。

var taskList = new List<Task<IEnumerable<MyObject>>>();

for (int i = 0; i < numOfBatches; i++)
{
    var task = Task.Factory.StartNew(() => MyMethod(variableA, variableB));
    taskList.Add(task);
}

//Wait for all the tasks to complete 
Task.WaitAll(taskList.Cast<Task>().ToArray());

return taskList.SelectMany(x => x.Result);

有没有更好的方法可以并行运行这些任务?我正在考虑每个循环的并行,但因为循环的迭代次数不固定,我不认为我可以为每个循环使用并行

代码不一定有问题。但是,如果我输入了10,000个项目,则大约需要18分钟,我在想是否可以并行运行任务,它可能会更快地返回。如果输入10,000个项目,则批次数将为10,000 / 25 = 400

MyMethod中的执行代码调用第三方外部服务,根据用户输入的数据返回数据

1 个答案:

答案 0 :(得分:2)

并行处理列表是最简单的并行算法:

ParallelEnumerable.Range(0, numOfBatches)
.Select(_ => MyMethod(variableA, variableB))
.ToList();

创建无限数量的任务是一种代码气味,因为这会导致资源耗尽,而且代码也很笨拙。