gpt4 book ai didi

c# - .NET 的并发收集超时?

转载 作者:太空狗 更新时间:2023-10-29 18:20:20 24 4
gpt4 key购买 nike

我有一个并发集合。

var q = new ConcurrentQueue<int>(); // Or a stack/bag/etc...

我可以得到这样的元素。

int i;
if (q.TryDequeue(out i))
DoStuff(i);

但我需要它,比如“在返回 false 之前等待 10 秒,以防有人添加新项目”:

int i;
if (q.TryDequeue(TimeSpan.FromSeconds(10), out i))
DoStuff(i);

我可以像这样写一个扩展方法:

public static bool TryDequeue<T>(
this ConcurrentQueue<T> queue,
TimeSpan timeout,
out T result)
{
// Validations...

for (int i = 0; i < 2; i++)
{
if (queue.TryDequeue(out result))
return true;
else if (i == 1)
return false;

Thread.Sleep(timeout);
}
}

但是如果有人在 5 秒内将一个项目添加到队列中怎么办,我不想再等 5 秒。

.NET 中是否有支持此功能的线程安全集合?

最佳答案

与其直接使用 ConcurrentQueue,不如将其包装在 BlockingCollection 中.然后您可以使用 TryTake(out T, TimeSpan) .

BlockingCollection 专为生产者/消费者场景设计。 (请注意,您应该同时查看 TPL Dataflow。)

关于c# - .NET 的并发收集超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15929194/

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