我有一个while循环,我在其中创建并启动任务,如下所示:
while (!stopped)
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
tasks.add(Task.Factory.StartNew(() => DoSomething(i)));
Task.WaitAll(tasks.ToArray());
}
如果在while循环之前创建一次任务,并且每次都重新启动(因为传递给函数的数据永远不会更改),我会获得更好的性能吗?
答案 0 :(得分:0)
您无法重启任务 http://msdn.microsoft.com/en-us/library/dd270682.aspx 顺便说一句
Task.Factory.StartNew(() => {....})
快于
Task task = new Task(() => {...});
task.Start();
因为没有锁定Start方法。
在您的情况下,使用async io来提升性能。
答案 1 :(得分:0)
您的代码没有任何根本性的错误。这是一种完全可以接受的方法。您无需担心创建任务的性能或成本高昂,因为TPL专门设计为与您完全一样使用。
但是,是代码的一个主要问题。你是closing over the loop variable。请记住,闭包捕获变量而不是值。 DoSomething
方法编写代码的方式不会使用您认为应该使用的i
值。你的代码需要像这样重写。
while(!停止) { 列出任务=新列表();
for (int i = 0; i < 10; i++)
{
int capture = i;
tasks.add(Task.Factory.StartNew(() => DoSomething(capture)));
}
Task.WaitAll(tasks.ToArray());
}
作为旁注,您可以使用Parallel.For
方法作为替代方法。如果没别的话,它绝对是一个更紧凑的解决方案。
while (!stopped)
{
Parallel.For(0, 10, i => DoSomething(i));
}