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 中是否有任何支持此功能的线程安全集合?

4

1 回答 1

17

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

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

于 2013-04-10T14:51:54.303 回答