Что использовать для ожидания неопределенного количества задач? - PullRequest
1 голос
/ 15 июня 2010

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

У меня есть System.Threading.Tasks.Task, который должен дождаться n число заданий для завершения, прежде чем начать. Сложность в том, что некоторые из ее зависимостей могут запускаться после запуска этой задачи (вы гарантированно никогда не нажмете 0 зависимых задач, пока все они не будут выполнены).

Вот то, что происходит

  1. Родительский поток создает где-то между 1 и (NUMBER_OF_CPU_CORES - 1) задач.
  2. Родительский поток создает задачу, которая будет запущена после завершения всех рабочих задач.
  3. Родительский поток создает поток мониторинга
  4. Поток мониторинга может убить рабочую задачу или порождать новую задачу в зависимости от нагрузки.

Я могу выяснить все до шага 4. Как получить задачу из шага 2, чтобы дождаться запуска, пока не завершатся все новые рабочие потоки, созданные на шаге 4?

1 Ответ

1 голос
/ 16 июня 2010

Вы можете передать массив Task, которого вы ожидаете, на TaskFactory.ContinueWhenAll вместе с новой задачей, которая будет запущена после того, как все они будут выполнены.

edit: Возможное решение проблемы с динамически генерируемыми задачами: иметь двухступенчатое продолжение; каждая «зависимая задача», которую вы запускаете, должна иметь цепочку ContinueWith, которая проверяет общее количество задач, которые еще выполняются, и, если она равна нулю, запускает реальную задачу продолжения. Таким образом, каждая задача будет выполнять проверку, когда она будет выполнена, но только последняя будет запускать следующую фазу. Конечно, вам нужно синхронизировать доступ к счетчику «оставшихся задач».

...