具有超时功能的.NET并发集合?

9

我有一个并发集合。

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

我可以获取像这样的项目。

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

但是我需要像这样的功能:“如果有人添加了新项目,则等待10秒钟后返回false”。
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中有支持此功能的线程安全集合吗?


1
这在理论上听起来像是Rx的一个适合场景。如果我没记错的话,可以进行基于时间的轮询。不过不确定多线程支持如何。 - Adam Houldsworth
1个回答

18

Jon,这个答案还有效吗?我开始使用BlockingCollection,但现在遇到了由于线程阻塞而引起的问题。您有没有其他关于.Net Framework的建议,例如“Channels”(似乎是.Net Core特定的)? - Gopichandar
@gopichandar:是的,答案仍然有效-但可能有许多原因导致阻塞问题。我建议您提出一个包含[mcve]的新问题。 - Jon Skeet
谢谢@jon,我已经添加了一个带有示例的链接。https://stackoverflow.com/questions/67123617/issue-with-blockingcollection-in-c-sharp-net-framework - Gopichandar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接