我有一个并发集合。
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中有支持此功能的线程安全集合吗?