gpt4 book ai didi

c# - TryTake 与 GetConsumingEnumerable

转载 作者:行者123 更新时间:2023-11-30 14:08:24 24 4
gpt4 key购买 nike

解决方案 1 和 2 之间的区别是什么,_taskQ 是 BlockingCollection,我正在尝试实现生产者-消费者场景。 BlockingCollection 使用默认的 ConcurrentQueue 进行内部存储。

//Solution 1
foreach (Action action in _taskQ.GetConsumingEnumerable())
{
action(); // Perform task.
Thread.Sleep(1000);
}

当没有项目时 TryTake 阻塞

//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 中,您在有任何操作时采取并执行操作,然后在消费者领先于生产者时退出循环。这可能不是您想要的。

关于c# - TryTake 与 GetConsumingEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35206087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com