我在我的应用程序中使用以下代码已经有几年了,从来没有遇到过任何问题。
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或lock等)。
使用Queue和AutoResetEvent的常用模式是什么,以解决这个问题并完成我尝试通过上述代码实现的操作?
(编辑后稍微更改了问题,因为正确指出Queue.Count可能会执行任何操作并且其实现是特定的。)