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);
}

TryTake vs GetConsumingEnumerable

如果没有项目,bool TryTake(out T)立即返回 false。
如果超时期限内没有项目,bool TryTake(out T, TimeSpan)返回 false。枚举对象由 GetConsumingEnumerable() 块返回,而它没有项目,直到生产者调用 CompleteAdding()

在解决方案 1 中,您等待下一个操作并执行它;一个合适的模式! 但是Thread.Sleep()并不是真正必要的,因为如果无论如何都没有项目,迭代就会阻塞。

在解决方案 2 中,在存在任何操作时执行并执行操作,然后在使用者领先于生产者时退出循环。 这可能不是你想要的。

相关文章:
  • 没有找到相关文章