1

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

4

2 回答 2

0

您无法重新启动任务 http://msdn.microsoft.com/en-us/library/dd270682.aspx 顺便说一句

Task.Factory.StartNew(() => {....})

Task task = new Task(() => {...});
task.Start();

因为没有锁定 Start 方法。

在您的情况下,使用 async io 来提高性能。

于 2013-10-25T10:00:32.313 回答
0

您的代码从根本上没有问题。这是一种完全可以接受的方法。您无需担心创建任务的性能或成本,因为 TPL 专门设计用于完全像您所做的那样使用。

但是,您的代码存在一个主要问题。您正在关闭循环变量。请记住,闭包捕获的是变量而不是。您的代码编写DoSomething方式不会使用i您认为应该使用的值。您的代码需要像这样重写。

while (!stopped) { 列出任务 = new List();

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));
}
于 2013-10-25T14:51:34.227 回答