C#中的队列和等待句柄

Mic*_*lli 5 .net c# queue multithreading autoresetevent

我已经在我的应用程序中使用了以下代码多年,并且从未见过它的问题.

while ((PendingOrders.Count > 0) || (WaitHandle.WaitAny(CommandEventArr) != 1))
{
    lock (PendingOrders)
    {
       if (PendingOrders.Count > 0)
       {
           fbo = PendingOrders.Dequeue();
       }
       else
       {
           fbo = null;
       }
    }

    // Do Some Work if fbo is != null
}
Run Code Online (Sandbox Code Playgroud)

其中CommandEventArr由NewOrderEvent(自动重置事件)和ExitEvent(手动重置事件)组成.

但我不确定这是否是线程安全的(假设N生成器线程在排队之前全部锁定队列,并且一个消费者线程运行上面的代码).此外,我们可以假设Queue.Count属性只从Queue类返回一个实例Int32值(没有volatile或者互锁或锁定等).

使用Queue和AutoResetEvent来解决这个问题的常用模式是什么,并且我正在尝试使用上面的代码做什么?

(在正确指出Queue.Count可以执行任何操作并且特定于其实现之后,编辑稍微更改了问题).

Han*_*ant 4

对我来说看起来相当线程安全,WaitAny() 将立即完成,因为事件已经设置。那不是问题。

不要破坏有效的线程同步。但如果您想要一个更好的捕鼠器,那么您可以考虑这篇杂志文章中的 Joe Duffy 的 BlockingQueue 。.NET 4.0 中提供了更通用的版本,System.Collections.Concurrent.BlockingCollection和 ConcurrentQueue 作为其实际实现。