2

I'm polling an external queue for job requests, then process the job (which takes ~1 minute). Currently, I'm doing it synchronously, which is inefficient because if there were 10 jobs, it would take 10 minutes. The machine can handle up to 5 jobs at the same time, so it should be able to process 10 jobs in ~2 minutes.

I've never done multi-threading, I've tried to read about async, await, Task.Run, but haven't had any success implementing it. Any suggestions on a simple way to implement this pseudocode?

while(concurrentJobs <= 5)
{
    job = pollForJob(); // synchronous

    processJob(job); // want to do this in background so that I can poll for next job
}

void processJob(job)
{
    concurrentJobs++;
    doStuff(); // takes 1 minute
    concurrentJobs--;
}
4

3 に答える 3

3

生産者と消費者のモデルがあるようです。この場合Parallel、新しい仕事はいつでも来る可能性があるため、授業は役に立ちません。Parallel何をする必要があるかを事前に知っている場合にのみ、クラスを使用できます。

ただし、いつでも新しい仕事が来る可能性がある場合は、次のアプローチを使用します。

プロデューサー

別の長時間実行Taskまたは使用を記述しますThread。このスレッドは、ネットワーク (キューやデータベースなど) などからジョブを受け取り、アイテムを共有メモリに配置します。

共有メモリ

BlockingCollectionジョブの追加と取得に使用します。これは、生産者と消費者の間の仲介者として機能します。

消費者

プロデューサーとまったく同じ -Thread利用可能なアイテムの共有メモリをチェックする別のもの。アイテムがキューから取得されると、それを自由に処理できます。


このような分離があれば、それぞれが独自のスレッドで実行される複数のプロデューサーとコンシューマーを簡単に作成できます。

于 2013-09-05T19:36:19.037 に答える