.NET超时并发收集?

时间:2013-04-10 14:49:42

标签: c# .net collections concurrency timeout

我有一个并发收藏。

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

我可以得到这样的项目。

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

但是我需要它“等待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中是否有支持此功能的线程安全集合?

1 个答案:

答案 0 :(得分:13)

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

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