是否可以在循环内创建任务,如下所示:
List<Task<string>> tasks = new List<Task<string>>();
for (int id = 0; id < 1000; id++)
{
tasks.add(new Task<string>((tId) =>
{
var taskId = (int)tId;
var rand = new Random(taskId);
long sum = 0;
for (int i = 0; i < 100000; i++)
{
sum += rand.Next(1000);
}
return string.Format("Task {0}: {1}", taskId, sum) ;
}, id));
}
然后开始所有这样的任务:
foreach (var task in tasks)
{
task.Start();
}
然后等待所有人完成:
Task.WaitAll(tasks.ToArray());
然后收获结果:
foreach (var task in tasks)
{
Console.WriteLine(task.Result);
}
此代码正在运行,但我无法控制并行度(最大线程数)。 我不知道这种做法是否正确?
答案 0 :(得分:2)
This MSDN artical描述了如何覆盖Task Scheduler类以达到您想要的效果。它被称为LimitedConcurrencyLevelTaskScheduler
,但是一个小建议......我已经工作了2个月,以便为我的要求获得绝对保存工作和快速解决方案,因此您必须在此任务中调查很多时间!您应该考虑该问题的其他解决方案。
顺便说一句,您可以查看PLinq lib和MaxDegreeofParallelism属性。但正如一位mircosoft开发者在研讨会上告诉我的那样。不要那样做! Task lib和PLinq lib在该领域进行了高度优化,因此如果你改变它,你将会遇到一个巨大的性能问题