2009-05-21 6 views
3

は、私は、新しいデータが利用可能であるときに呼び出されるコールバックメソッドを持っているスレッドセーフ非同期バイトキュー

public interface IDataSource 
{ 
    IAsyncResult BeginRead(
     byte[] buffer, 
     int offset, 
     int size, 
     TimeSpan timeout, 
     AsyncCallback callback, 
     object state); 

    int EndRead(
     IAsyncResult asyncResult); 

    int Read(
     byte[] buffer, 
     int offset, 
     int size, 
     TimeSpan timeout); 
} 

これは明らかに古くからのプロデューサ - コンシューマの問題です。バイトはコールバックメソッドの呼び出しによって生成され、Begin/EndReadおよびReadメソッドによって消費されます。 Begin/EndReadおよびReadメソッドは、データが使用できない場合(タイムアウトが発生するまで)ブロックされます。実装では、固定サイズの内部バッファを使用する必要があるため、バッファが現在いっぱいになったときにコールバックメソッドをブロックする必要があります。

マルチスレッド化を考えると、通常は重度の頭痛が発生しますので、私の質問は次のとおりです。このようなデータ構造の実装は既に存在しますか?

は(私は非常に簡単であるべきReadメソッドを実装すると思うが、私は読んで/ EndReadを開始実装しないようにしたいと思います。Begin/EndInvoke。)

答えて

0

私はあなたが "でGoogle検索を行うべきだと思いますロックレスキュー "と呼ばれる。私はそう多くの便利なヒットを得た。

1

IAsyncResult経由で非同期である必要がありますか?私は汎用ブロックキューhereを持っています(つまり、データがなくなるまで読者がブロックされるか、閉じられていて、スペースがあるまでブロックされます)。それはbyte[]のために特別に最適化されていませんが、限り、サイズが膨大ではないとして、それは対処すべきである - しかし、それは必要とブロッキングキューとして(少なくとも一つの)専用コンシューマスレッド、やって:

T val; 
while(queue.TryDequeue(out val)) { 
    // process val 
} 
+0

が何をだそのI探していますが、これを変更してbyte []に​​最適化できるはずです。残念ながら、インターフェイスではBegin/EndReadメソッドも実装する必要があります... – dtb