Мне нужно реализовать зависимости от графика зависимости с помощью 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");
}
Есть ли более элегантное решение?
Поскольку большая часть вашего графика состоит из простых путей, вы можете упростить код до чего-то вроде (при условии, что граф зависимостей исправлен):
Task task125 = factory.StartNew(() => { A(); B(); E(); });
Task task647 = factory.StartNew(() => { F(); D(); G(); });
Task.WaitAll(task125, task647);
C();
B()
будет вызываться (а не «реализовано», что здесь не имеет смысла) только после возвратаA()
.