多年来,我的应用程序中一直有以下代码,但从未遇到过问题。
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
}
其中 CommandEventArr 由 NewOrderEvent(自动重置事件)和 ExitEvent(手动重置事件)组成。
但是我不确定这是否是线程安全的(假设 N 个生产者线程在入队之前都锁定了队列,一个消费者线程运行上面的代码)。此外,我们可以假设 Queue.Count 属性仅从 Queue 类返回一个实例 Int32 值(没有 volatile 或 interlocked 或锁等)。
与 Queue 和 AutoResetEvent 一起使用来解决此问题并使用上面的代码执行我尝试执行的操作的常用模式是什么?
(在正确指出 Queue.Count 可以做任何事情并且它的具体实现之后,稍微改变了这个问题)。