Для проекта мне нужно немного потрудиться в течение нескольких минут, а затем продолжить. Некоторые части процесса получают данные, другие обрабатывают (ЦП).
У меня есть три задачи с циклом while, что-то похожее на это (раз 3):
private void WorkerA()
{
int cnt = 0;
while ( cnt < _TotalAmountOfItems )
{
_QueueA.TryDequeue(out var item);
if ( group == null )
{
Thread.Sleep(100);
continue;
}
var result = DoWork(item); // or GetFromDb() or BulkInsert(), etc
_QueueB.Enqueue( result );
cnt++;
}
}
А потом что-то похожее на:
var task_a = Task.Run( () => WorkerA() );
var task_b = Task.Run( () => WorkerB() );
var task_c = Task.Run( () => WorkerC() );
Task.WaitAll( task_a, task_b, task_c );
с cnt < _TotalAmountOfItems
Теоретически я проверяю, выполнен ли отдельный работник, чтобы мы могли закрыть работника, и в итоге получить агрегированный результат и продолжить как обычно.
Хотя я вижу множество проблем с этим. То есть что если один WorkerA дает сбой, то W orkerB и C будут в цикле навсегда .
Прежде чем изобретать велосипед, я уверен, что эта проблема была решена в прошлом. Какой шаблон мне нужно искать (C #)?
Важно
В этом случае я связан с одним процессом. Мне нужно сделать это в течение нескольких минут, а затем очистить все позади меня. Я не могу оставить рабочих всегда включенными.
По запросу дополнительная информация:
- Рабочий A получает большие объемы данных из табличного хранилища (в пакетном режиме)
- Рабочий B обрабатывает данные (с привязкой к процессору)
- Рабочий C загружает данные обратно в хранилище таблиц (пакетами)