C#重新使用或重新创建任务?

时间:2013-10-24 04:31:31

标签: c# multithreading task

我有一个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循环之前创建一次任务,并且每次都重新启动(因为传递给函数的数据永远不会更改),我会获得更好的性能吗?

2 个答案:

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