多名工人(相同实例)-确定何时完成工作的模式?

时间:2018-06-23 12:27:21

标签: c# queue task worker

对于一个项目,我需要在几分钟内完成一些繁重的工作,然后继续。该过程的某些部分正在获取数据,其他部分正在处理(CPU)。

我有一个带有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正在处理数据(绑定CPU)
  • Worker C正在将数据分批升级回表存储中

0 个答案:

没有答案