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可以执行任何操作并且特定于其实现之后,编辑稍微更改了问题).
对我来说看起来相当线程安全,WaitAny() 将立即完成,因为事件已经设置。那不是问题。
不要破坏有效的线程同步。但如果您想要一个更好的捕鼠器,那么您可以考虑这篇杂志文章中的 Joe Duffy 的 BlockingQueue 。.NET 4.0 中提供了更通用的版本,System.Collections.Concurrent.BlockingCollection和 ConcurrentQueue 作为其实际实现。