1

我正在实现一个打印机队列来处理 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();
   }
}
4

1 回答 1

2

只需等待旧线程退出即可。不要使用池化解决方案,IsAlive因为它们很少起作用。

if (_processor != null) _processor.Join();
于 2013-02-27T12:24:11.983 回答