Несколько рабочих (один и тот же пример) - шаблоны для выяснения, когда работа сделана? - PullRequest
0 голосов
/ 23 июня 2018

Для проекта мне нужно немного потрудиться в течение нескольких минут, а затем продолжить. Некоторые части процесса получают данные, другие обрабатывают (ЦП).

У меня есть три задачи с циклом 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 загружает данные обратно в хранилище таблиц (пакетами)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...