2

是否可以在这样的循环中创建任务:

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);
}

此代码正在运行,但我无法控制并行度(最大线程数)。我不知道这种做法是否正确?

4

1 回答 1

2

这篇 MSDN 文章描述了如何重写任务计划程序类来达到你想要的。它被称为LimitedConcurrencyLevelTaskScheduler只是一个小建议......我已经工作了 2 个月来获得一个绝对节省工作和快速解决方案以满足我的要求,所以你必须在这个任务中调查很多时间!您应该考虑针对该问题的其他解决方案。

顺便说一句,您可以查看 PLinq 库和MaxDegreeofParallelism属性。但正如 mircosoft 开发人员在研讨会上告诉我的那样。不要那样做!Task 库和 PLinq 库在该领域进行了高度优化,因此如果您更改它,您将遇到巨大的性能问题

于 2013-08-04T16:12:42.640 回答