我以前没有使用过并发队列。
在 while 循环中使用 TryDequeue 是否可以?难道这事就不能永远陷下去了吗?
var cq = new ConcurrentQueue<string>();
cq.Enqueue("test");
string retValue;
while(!cq.TryDequeue(out retValue))
{
// Maybe sleep?
}
//Do rest of code
从某种意义上说,它是安全的,直到有一个项目被取出时,循环才会真正结束,并且如果队列有一个项目要取出,它最终会结束。如果队列被另一个线程清空并且没有添加更多项目,那么循环当然不会结束。
除此之外,你所拥有的是一个繁忙的循环。实际上应该始终避免这种情况。要么你最终不断地轮询队列来请求更多的项目,浪费 CPU 时间和进程的精力,要么你最终进入睡眠状态,因此在添加队列中的项目后并没有真正使用它(即使如此,仍然浪费some上下文切换的时间/精力只是为了轮询队列)。
如果你发现自己处于想要“等到有东西让我拿走”的境地,你应该做的就是使用BlockingCollection
。这是具体来说旨在包装各种类型的并发集合并阻塞,直到有一个项目可供获取。它允许您将代码更改为queue.Take()
并且让它更容易编写,从语义上陈述你正在做的事情,明显正确,明显更有效,并且完全安全。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)