2013-04-10 10 views
8

私はコンカレントコレクションを持っています。タイムアウトのある.NETの同時収集ですか?

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

+1

[Rx](http://msdn.microsoft.com/en-us/data/gg577609.aspx)のようなものです。 。メモリが使用されている場合、時間ベースのポーリングを行うことは可能です。しかし、マルチスレッドのサポートがどんなものかはわかりません。 –

+0

@Adam:それを調べます。ありがとうございます。 –

答えて

12

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

BlockingCollectionは、特にプロデューサ/コンシューマのシナリオ用に設計されています。 (あなたはTPL Dataflowを同時に見てください。)

関連する問題