[英]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.