9

私は並行コレクションを持っています。

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 でこの機能をサポートするスレッドセーフなコレクションはありますか?

4

1 に答える 1

17

直接使用するのではなく、ConcurrentQueueでラップする必要がありBlockingCollectionます。を使用できますTryTake(out T, TimeSpan)

BlockingCollectionプロデューサー/コンシューマーのシナリオ向けに特別に設計されています。( TPL データフローも同時に確認する必要があります。念のため。)

于 2013-04-10T14:51:54.303 に答える