Вот эскиз класса, который может это сделать:
public class WorkerQueue<T> {
private Queue<T> workerQueue = new Queue<T>();
private object padlock = new object();
private bool isProcessing = false;
private Thread workerThread;
public void QueueWorkItem(T item) {
lock(padlock) {
workerQueue.Enqueue(item);
if (!isProcessing) {
isProcessing = true;
workerThread = new Thread(() => { this.ProcessWork });
workerThread.Start();
}
}
}
private void ProcessWork() {
// 1) Thread-safe dequeue operation
// 2) Keep processing while work is on the queue. External callers can
// add items to the queue while this is ongoing.
// 3) When the queue is empty, set isProcessing to false (thread-safely)
}
}
Приложения будут использовать это так:
public class Application {
private WorkerQueue<object> workerQueue = new WorkerQueue<object>();
// This can run on multiple threads if need be
public void SomeMethodThatCreatesWork() {
object workItem = ExternalCall();
this.workerQueue.QueueWorkItem(workItem);
}
}
Вероятно, было бы полезно разрешить приложениям также останавливать обработку, возможно, добавив флаг, который ProcessWork
мог бы проверять после снятия с очереди каждого элемента, но не ясно, что делать с необработанными элементами (возможно, этого было бы достаточно разрешить доступ к ним и разрешить звонящему).