Запуск задач внутри цикла: как передать значения, которые можно изменить внутри цикла? - PullRequest
7 голосов
/ 26 марта 2011

Я пытаюсь использовать TPL внутри цикла while, и мне нужно передать задаче некоторые значения, которые затем изменяются в цикле.Например, здесь показан пример с индексом, который увеличивается (обязательно после строки, в которой запрашивается создание задачи):

int index = 0;
Task[] tasks;
while(/*condition*/)
{
    tasks[index] = Task.Factory.StartNew(() => DoJob(index));
    index++;
}

Но, конечно, это не работает, поскольку значение индексаможет быть увеличено до начала задачи.Возможное решение может состоять в том, чтобы передать также WaitHandle, который ожидает до увеличения индекса, и это должно быть передано в метод DoJob, но это не кажется мне действительно хорошим решением.Любая другая идея?

1 Ответ

17 голосов
/ 26 марта 2011

Назначьте значение временной переменной внутри цикла:

int index = 0;
Task[] tasks;
while(/*condition*/)
{
    int value = index;
    tasks[index] = Task.Factory.StartNew(() => DoJob(value));
    index++;
}

Таким образом, каждая задача будет иметь свою собственную копию значения, которое index имело во время итерации цикла while вкоторый был сделан на StartNew.

...