C# 重用或重新创建任务

本文关键字:创建 任务 新创建 | 更新日期: 2023-09-27 18:36:50

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

C# 重用或重新创建任务

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

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

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

因为没有锁定启动方法。

在您的情况下,使用异步io来提升性能。

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

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

而(!{ 列表任务 = 新列表();

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