Şaf*_*Gür 8 .net c# collections concurrency timeout
我有一个并发的集合.
var q = new ConcurrentQueue<int>(); // Or a stack/bag/etc...
Run Code Online (Sandbox Code Playgroud)
我可以买到这样的物品.
int i;
if (q.TryDequeue(out i))
DoStuff(i);
Run Code Online (Sandbox Code Playgroud)
但是我需要它像"在有人添加新项目之前等待10秒再返回假":
int i;
if (q.TryDequeue(TimeSpan.FromSeconds(10), out i))
DoStuff(i);
Run Code Online (Sandbox Code Playgroud)
我可以写一个像这样的扩展方法:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果有人在5秒钟内将一个项目添加到队列中,我不想再等5个.
是否有任何线程安全的集合在.NET中支持此功能?
Jon*_*eet 13
而不是ConcurrentQueue直接使用,你应该把它包装成一个BlockingCollection.然后你可以使用TryTake(out T, TimeSpan).
BlockingCollection专为生产者/消费者场景而设计.(请注意,您应该同时查看TPL Dataflow.)
| 归档时间: |
|
| 查看次数: |
2613 次 |
| 最近记录: |