私は並行コレクションを持っています。
var q = new ConcurrentQueue<int>(); // Or a stack/bag/etc...
こんな商品が手に入ります。
int i;
if (q.TryDequeue(out i))
DoStuff(i);
しかし、「誰かが新しいアイテムを追加した場合に備えて、false を返す前に 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 でこの機能をサポートするスレッドセーフなコレクションはありますか?