繁体   English   中英

C#重用还是重新创建任务?

[英]C# Re-use or re-create tasks?

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

您不能重启任务http://msdn.microsoft.com/en-us/library/dd270682.aspx

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

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

因为没有锁定Start方法。

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

您的代码从根本上没有错。 这是一个完全可以接受的方法。 您无需担心创建任务的性能或成本,因为TPL是专门为完全按照您的使用目的而设计的。

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

while(!stopped){列表任务=新的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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM