【发布时间】:2013-04-10 14:49:42
【问题描述】:
我有一个并发集合。
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 中是否有任何线程安全集合支持此功能?
【问题讨论】:
-
理论上这听起来很适合Rx。如果有记忆,可以进行基于时间的轮询。但不确定多线程支持是什么样的。
-
@Adam:会调查一下,谢谢。
标签: c# .net collections concurrency timeout