2017-01-05 2 views
0

У меня довольно сложная настройка и вам нужен вход, как ее разрешить.Моделирование: параллельная очередь с зависимостями

У меня есть процесс А, который состоит из 1,2а задач, 2b, 2c, 3a, 3b, 3c и 4.

Задача 1 должен первым выполнить ни с кем-либо из этих задач параллельно.

Задачи 2a, 2b, 2c должны запускаться один за другим, но могут выполняться параллельно с 3a, 3b, 3c (которые также должны запускаться один за другим. Задача 4 может выполняться только после того, как 3c и 2c

Сначала я реализовал это с помощью Priority Queue и попытался управлять им с помощью Приоритетов и механизма, который только отменяет только один из видов, означающий, что 2a и 3a могут быть удалены одновременно, 2b и 3b и т. д.

Но если 3a сделано и может начаться 3b, ему также нужно дождаться 2a. Мне нужна идея механизма очереди, который каким-то образом может справиться с моей ситуацией. Я знаю, что это сложно, но любой намек, вероятно, будет помогите мне.

+0

TPL Dataflow для победы. https://www.google.co.uk/search?q=tpl+dataflow – spender

+0

Это довольно широкий вопрос, можете ли вы сузить проблему и, возможно, опубликовать какой-нибудь существующий код? Трудно ответить на это кратко. – nozzleman

+0

Необходимо выполнить блокировку после запуска каждой параллельной группы задач. Вы можете использовать WaitHandler для блокировки. См. Msdn: https://msdn.microsoft.com/en-us/library/58195swd(v=vs.110).aspx – jdweng

ответ

0

Whith async и await ваше решение будет выглядеть следующим образом (если у вас есть методы Run...Async для запуска ваших индивидуальных задач и которые возвращают задачи):

async Task RunTasks2Async() { 
    await RunTask2aAsync(); 
    await RunTask2bAsync(); 
    await RunTask2cAsync(); 
} 

async Task RunTasks3Async() { 
    await RunTask3aAsync(); 
    await RunTask3bAsync(); 
    await RunTask3cAsync(); 
} 

async Task RunAllTasks() 
{ 
    await RunTask1(); 
    Task task2 = RunTasks2Async(); 
    Task task3 = RunTasks3Async(); 
    await Task.WhenAll(task2, task3); 
    await RunTask4Async(); 
} 

Если вы хотите, чтобы не использовать async/await, вы может использовать Task.ContinueWith для последовательного выполнения ваших задач и Task.WhenAll для параллельного выполнения.

Смежные вопросы