TryTake vs GetConsumingEnumerable
本文关键字:GetConsumingEnumerable vs TryTake | 更新日期: 2023-09-27 18:33:11
解决方案1和2有什么区别,_taskQ是BlockingCollection,我正在尝试实现生产者 - 消费者方案。BlockingCollection 使用默认的 ConcurrentQueue 进行内部存储。
//Solution 1
foreach (Action action in _taskQ.GetConsumingEnumerable())
{
action(); // Perform task.
Thread.Sleep(1000);
}
没有项目时尝试块
//Solution 2
Action t;
while(_taskQ.TryTake(out t))
{
t();
Thread.Sleep(1000);
}
如果没有项目,bool TryTake(out T)
立即返回 false。
如果超时期限内没有项目,bool TryTake(out T, TimeSpan)
返回 false。枚举对象由 GetConsumingEnumerable()
块返回,而它没有项目,直到生产者调用 CompleteAdding()
。
在解决方案 1 中,您等待下一个操作并执行它;一个合适的模式! 但是Thread.Sleep()
并不是真正必要的,因为如果无论如何都没有项目,迭代就会阻塞。
在解决方案 2 中,在存在任何操作时执行并执行操作,然后在使用者领先于生产者时退出循环。 这可能不是你想要的。