C# 在循环中创建任务
是否可以在循环内创建如下任务:C# 在循环中创建任务,c#,multithreading,task-parallel-library,C#,Multithreading,Task Parallel Library,是否可以在循环内创建如下任务: 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 = n
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);
}
此代码正在运行,但我无法控制并行度(最大线程数)。
我不知道这种做法是否正确?描述了如何重写Task Scheduler类以达到您想要的效果。它被称为limitedconcurrenceyleveltaskscheduler
,但有一个小建议。。。我已经工作了2个月,以获得一个绝对节省工作和快速的解决方案,为我的要求,所以你必须调查这项任务的大量时间!你应该考虑这个问题的其他解决方案。
顺便说一句,您可以查看PLinq库和属性。但正如mircosoft开发人员在一次研讨会上告诉我的那样。不要那样做!。任务库和PLinq库在该领域进行了高度优化,因此,如果您更改,将出现巨大的性能问题有没有理由不使用并行LINQ?这听起来是一种更自然的方法。为什么需要控制线程数?@JonSkeet您可以帮我使用P-LINQ!。我是TPL和LINQ的新手:)我不理解您的文字中使用的算法,先生。好吧,简短的版本“这是可能的,但不要这样做。这很难管理,任务很长,如果您没有花两个月的时间,您将获得gigant性能滞后”;-)自由创造你自己的答案,而不是批评别人。。。我不是批评你的答案,只是批评你误导人的打字方式。