График зависимостей. Параллельная обработка

1

Мне нужно реализовать зависимости от графика зависимости с помощью TPL (все процессы должны начинаться параллельно). Вот мой код:

TaskFactory factory = Task.Factory;

// 1 and 6
Task task_1 = factory.StartNew(() => A());
Task task_6 = factory.StartNew(() => F());

// 4 and 6
Task task_2 = task_1.ContinueWith((t) => B());
Task task_4 = task_6.ContinueWith((t) => D());

// 5 and 7
Task task_5 = task_2.ContinueWith((t) => E());
Task task_7 = task_4.ContinueWith((t) => G());

// 3
Task task_3 = factory.ContinueWhenAll(new[] { task_1, task_2, task_4, task_5, task_6, task_7 }, (tasks) => C());
Task.WaitAll(task_3);

Все мои методы выглядят так:

private static void A()
{
    Console.WriteLine("1");
}

Есть ли более элегантное решение?

Теги:
parallel-processing
graph
task-parallel-library

1 ответ

1
Лучший ответ

Поскольку большая часть вашего графика состоит из простых путей, вы можете упростить код до чего-то вроде (при условии, что граф зависимостей исправлен):

Task task125 = factory.StartNew(() => { A(); B(); E(); });
Task task647 = factory.StartNew(() => { F(); D(); G(); });

Task.WaitAll(task125, task647);

C();
  • 0
    svick, большое спасибо! У меня есть вопрос: сохраняются ли зависимости A-> B-> E в вашем решении? Я имею в виду, гарантируется ли, что метод B () не будет реализован до метода A ()?
  • 0
    @ user3649515 Да, именно так работает нормальное процедурное программирование, гарантируется, что B() будет вызываться (а не «реализовано», что здесь не имеет смысла) только после возврата A() .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню