我有以下代码:
public IEnumerable<Task> ExecuteJobs(Action[] pJobsToExecute)
{
var tasks = new Task[pJobsToExecute.Length];
for (int i = 0; i < pJobsToExecute.Length; i++)
{
//tasks[i] = new Task((index) => ProcessJob(pJobsToExecute[(int)index], (int)index), i);
//tasks[i].Start();
tasks[i] = new Task(() => ProcessJob(pJobsToExecute[i], i));
tasks[i].Start();
}
return tasks;
}
public void ProcessJob(Action jobToProcess, int index)
{
// ...
}
我需要记录发送到 ProcessJob 方法的任务的顺序,为此我使用 index 参数。但是这段代码:
tasks[i] = new Task(() => ProcessJob(jobs[i], i));
tasks[i].Start();
不会给出执行动作的正确顺序。此代码将给出正确的顺序:
tasks[i] = new Task((index) => ProcessJob(pJobsToExecute[(int)index], (int)index), i);
tasks[i].Start();
我不明白为什么这个 Task 的重载可以解决这个问题。i 是否根据实际执行顺序传递给 index 参数?还是我的测试不正确,这段代码也会失败?