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