Как бы вы создали циклический граф задач в TPL, и / или это возможно? - PullRequest
0 голосов
/ 12 февраля 2011

Мой проект требует сбора данных из ряда источников, а затем что-то делать в ответ на завершение сбора этих данных.Некоторые из задач по сбору зависят от предыдущих задач по сбору.TPL хорошо подходит, потому что он, естественно, продолжает задачи от своих предшественников, а «конечные» задачи, которые используют результаты, снова являются зависимыми.Отлично.Тем не менее, мы хотели бы иметь задачу «сон и повтор», которая начинается после завершения «финальных» задач;Задача этой задачи состоит в том, чтобы логически быть предшественником «заключительных» задач и начать следующий цикл.По сути, DAG TPL становится циклическим или, если рассматривать последовательно, циклом.

Возможно ли полностью выразить это циклическое требование в API TPL?Если так, то как?Вместо этого наша текущая реализация выполняет WaitAll () на предшествующих объектах, а затем Task.StartNew () для делегата, который выполняет спящий режим с последующей перестройкой графа задач с WaitAll () .Это работает, но кажется немного искусственным.

1 Ответ

0 голосов
/ 12 февраля 2011

Здесь есть несколько вариантов. То, что вы делаете сейчас, кажется разумным.

Однако вы могли бы потенциально настроить всю операцию как сценарий производителя / потребителя, используя BlockingCollection<T>. Если ваше поглощающее перечисление использовало ManualResetEvent, которое было установлено после завершения WaitAll, это могло бы позволить потреблять один «элемент» за раз, используя задачи, как вы их написали сейчас.

При этом кажется, что это идеальный кандидат для библиотеки TPL Dataflow (в CTP).

...