Помощь с использованием параллельной библиотеки задач - PullRequest
3 голосов
/ 08 февраля 2011

Я пытаюсь запланировать вызов функции для последовательности элементов с использованием параллельной библиотеки задач.

Следующее не работает

List<Task> tasks = new List<Task>();

foreach(var someValue in aCollection)
{
   var t = Task.Factory.StartNew(() => DoSomeWork(someValue));
   tasks.Add(t);
}

Task.WaitAll(tasks.ToArray());

Но ниже работает

Task.WaitAll(aCollection.Select(a => Task.Factory.StartNew(() => DoSomeWork(a))).ToArray());

Для первого подхода он выполняется один раз, а затем останавливается. Я не уверен, переписывает ли это ссылку или что-то. Может кто-то, пожалуйста. объяснить?

Также есть способ передать некоторый порядковый номер Задаче, который можно использовать для определения того, какая задача была запланирована первой. Я хочу дождаться завершения всех задач, но затем упорядочить результаты на основе последовательности в коллекции.

1 Ответ

5 голосов
/ 08 февраля 2011

Я не знаю, приводит ли это к остановке выполнения, но, возможно, это потому, что вы закрываете переменную цикла здесь:

DoSomeWork(someValue));

Вам нужно создать локальную переменную и присвоить ей someValue, а затем использовать эту локальную переменную, как описано в моем связанном вопросе, например:

foreach(var someValue in aCollection)
{
   var localCopy = someValue;

   var t = Task.Factory.StartNew(() => DoSomeWork(localCopy));
   tasks.Add(t);
}

Опять же, я не знаю, является ли это проблемой вашей тупиковой ситуации, но это одна из проблем, которая скорее всего вызовет проблемы.

...