基本的に、処理したいオブジェクトの静的カスタム キューがあります。複数のスレッドから、キューに入れられたオブジェクトを処理する単一の Task を開始し、すべての項目がキューから取り出されたときにタスクを停止する必要があります。
いくつかの疑似コード:
static CustomQueue _customqueue;
static Task _processQueuedItems;
public static void EnqueueSomething(object something) {
_customqueue.Enqueue(something);
StartProcessingQueue();
}
static void StartProcessingQueue() {
if(_processQueuedItems != null) {
_processQueuedItems = new Task(() => {
while(_customqueue.Any()) {
var stuffToDequeue = _customqueue.Dequeue();
/* do stuff */
}
});
_processQueuedItems.Start();
}
if(_processQueuedItems.Status != TaskStatus.Running) {
_processQueuedItems.Start();
}
}
それが違いを生む場合、私のカスタムキューは、特定の年齢に達するまでアイテムを本質的に保持するキューであり、その後、それらをデキューできます。アイテムに触れるたびに、タイマーが再び開始されます。私はこの作品がうまくいくことを知っています。
私が苦労している部分は、並列処理です。(明らかに、ここで何をしているのかわかりません)。私が望むのは、キューが完了するまで 1 つのスレッドでキューを処理し、それから離れることです。別の呼び出しが入った場合、必要がない限り、新しいスレッドを開始しません。
それが私の問題をうまく説明してくれることを願っています。