2010-12-27 3 views
2

C#でストリームを扱う方法を理解するのに苦労しています。C#でパイプを実装する - どの(ストリーム?)クラスを使用するのですか?

私は、このフォームのクラスを持っていることを計画:

class Pipe { 
    public void PutChar(char c) { ... } 
    public char GetChar() { ... } 
} 

アイデアは、あるスレッドがそのPutChar()方法を通じて、このPipeに文字を配置します、と後で他のスレッドで取得するGetChar()を利用しますということですPipeにある文字。

Javaでは、私はPipedReaderPipedWriterクラスを使用します。 C#では同等のクラスが存在しないようですので、ここではどのクラス(ストリーム?)を使用しますか?または、これを実装する正しい方法はストリームではありませんか?代わりに、Queueを使用する方が良いでしょうか?

おかげ

+0

他の人が答えたように、特定の名前付きパイプOSの実装を探しているのかどうかはわかりません。おそらく、あなたは一般的な意味でパイプを見ているでしょうか?私は – kenny

答えて

4

あなたがスレッド間で通信したいとあなたはあなたがプロデューサーコンシューマ・キューを作成することができます

の1-よりも、上記の回答で述べたように任意のNamedPipesのを使用したくないので。

2:ConcurrentQueueより.net 4.0を使用している場合は使用できます。

0

NamedPipe'sを見てみましょう。また、this投稿をご覧ください。

+0

私はIPCをしたくありません。私は名前付きパイプを望んでいません。 –

1

パイプにストリームできるクラスについては、System.IO.Pipes名前空間を参照してください。ただし、WCFは、アプリケーションでパイプを実装するためにNetNamedPipeBindingを使用することをお勧めします。

+0

それは私がふりをするより "重く"見えます。私は、プロセス間ではなく、スレッド間でやりとりする方法がほしいです。 –

+0

なぜスレッド間で通信する必要がありますか? 1つのスレッドはある種の作業者ですか? –

+0

はい、「左」スレッドはプロデューサであり、「右」スレッドはコンシューマです。 –

-1

StreamReader & StreamWriterは、PipedReader & PipedWriterと非常によく似ています。バッファを保持するようにMemoryStreamを宣言すると、それを実装することができます。

クイックコードサンプルは、あなたが探しているものを下回る可能性があります。

class Pipe { 
    MemoryStream _ms; 
    StreamReader _sr; 
    StreamWriter _sw; 

    public Pipe() 
    { 
     _ms = new MemoryStream(); 
     _sr = new StreamReader(_ms); 
     _sw = new StreamWriter(_ms); 
    } 

    public void PutChar(char c) { _sw.Write(c) } 
    public char GetChar() { return _sw.Read(); } 
} 
+0

あなたは_sr.Read()を意味するのでしょうか?いずれにしても動作しないようです:(パイプにデータを追加しようとしましたが、GetChar()を使ってデータを取得しようとしました。 –

+0

メソッドをインスタンス化して呼び出す方法は?あなたのスレッドがPipeクラスの同じインスタンスを使用していることを確認していますか? –

+0

コードをテストするために、私はただ1つのスレッド(メインスレッド)を使用しました。 –

1

.NET 4.0を使用している場合は、BlockingCollectionとTask Parallel Libraryを参照してください。これらの2つを組み合わせると、タスクを使用してスレッド間でデータを移動するのに最適な方法が作成されます。

Example code on MSDNには、実行する必要があるすべてが表示されます。

関連する問題