2011-08-05 10 views
2

私はTcpSocketから読み込むためにStreamReaderを使い、そのTcpSocketに書き込むためにStreamWriterを使用しています。私はあるスレッドで読書コードを持ち、別のスレッドで書くコードを持っていたいと思います。どのようにスレッドセーフな方法でこれを行うのですか?StreamReader/StreamWriterを使用した基本的なマルチスレッド

私は次の操作を行う場合は、その後、私はライター・スレッドは、多くの場合、ブロックされます推測:

ここ
lock (tcpClient) { 
    streamReader.ReadLine(); 
} 

は、作家のコードのようになります。

lock (tcpClient) { 
    streamWriter.WriteLine(line); 
} 

答えて

3

上送信しても安全です一方のスレッドは他方のスレッドで受信する。

ですから、1つのスレッドでこれを行うことができます:

streamReader.ReadLine(); 

、これを別のスレッドで:

streamWriter.WriteLine(line); 

tcpClientをロックすることなく。

+0

回答ありがとうございますが、これはどこに文書化されていますか? MSDNによると、StreamReaderとStreamWriterのインスタンスメンバーはスレッドセーフであるとは保証されていません。 – Tom

+1

どこに書かれているか分かりません。スレッドセーフティステートメントは、ほぼすべてのクラスに現れる標準的な定型文です。 .NET SocketクラスはWinsock APIのラッパーです。したがって、 'StreamWriter.WriteLine'呼び出しは、最終的に送信バッファにバイトを配置するWinsockの' send'関数を呼び出します。 'StreamReader.ReadLine()'コールは、受信バッファからバイトを読み取るWinsock 'receive'関数を呼び出します。したがって、1つのスレッドだけが送信バッファに書き込みを行い、1つが受信バッファから読み取る限り、共有されるリソースはありません。 – dtb

関連する問題