私の基本的な問題は、キューが空の場合はすぐにキューからアイテムを処理する必要があるか、キューにアイテムを追加して、すでに処理されているアイテムがある場合は終了する必要があることです。
私は、ピークを使用して物事を単純化する手法を試していますが、邪魔になる可能性のある落とし穴があるのではないかと考えています。ありがとう!
void SequenceAction(Action action) {
bool go = false;
lock (_RaiseEventQueueLock) {
_RaiseEventQueue.Enqueue(action);
go = (_RaiseEventQueue.Count == 1);
}
// 'go' can only be true if queue was empty when queue
// was locked and item was enqueued.
while (go) {
#if naive_threadsafe_presumption
// Peek is threadsafe because in effect this loop owns
// the zeroeth item in the queue for as long as the queue
// remains non-empty.
(_RaiseEventQueue.Peek())();
#else
Action a;
lock (_RaiseEventQueueLock) {
a = _RaiseEventQueue.Peek();
}
a();
#endif
// Lock the queue to see if any item was enqueued while
// the zeroeth item was being processed.
// Note that the code processing an item can call this
// function reentrantly, adding to its own todo list
// while insuring that that each item is processed
// to completion.
lock (_RaiseEventQueueLock) {
_RaiseEventQueue.Dequeue();
go = (_RaiseEventQueue.Count > 0);
}
}
}