我正在实现一个打印机队列来处理 c#2.0 中的 GDI 转换。要处理的作业由主线程添加,主线程为每台打印机设置一个线程来处理这些作业。完成所有作业后,打印线程将等待五秒钟以等待更多作业到期。
然后创建一个新线程,下次传递打印作业时。重要的是每台打印机只有一个线程以保持作业按顺序排列。
不幸的是,当线程到期时添加打印作业时似乎存在竞争条件 - Thread.IsAlive 可以在作业完成处理后为真。
我可以防止这种情况发生吗?
简化版:
private Thread _processor;
readonly private AutoResetEvent _newPrintItemAdded = new AutoResetEvent(true);
readonly ThreadSafeQueueWrapper<IPrintItem> _printingQueue = new ThreadSafeQueueWrapper<IPrintItem>(5);
public void Add(IPrintItem item)
{
_printingQueue.Enqueue(item);
//Resume processing thread if waiting.
_newPrintItemAdded.Set();
StartProcessorIfNeeded();
}
public void StartProcessorIfNeeded()
{
if (_processor != null && _processor.IsAlive) return;
_processor = new Thread(RunThread)
_processor.Start();
}
public void RunThread()
{
//timeout if no items added to queue
while (_newPrintItemAdded.WaitOne(5000))
{
ProcessQueueItems();
}
//Thread is alive here, but won't process any more items
}
private void ProcessQueueItems()
{
// get the print job off the queue
IPrintItem currentPrinter;
while (_printingQueue.TryDequeue(out currentPrinter))
{
currentPrinter.Print();
}
}