2017-10-12 19 views
0

Long story short StreamWriterを使用してTcpClient経由で文字列を送信しようとしています。なぜこれらの2つのStreamWriterコンストラクタが私に異なる結果を与えるのですか?

これらのサンプルを交換する以外は他のコードを変更しないでください。それらは異なる結果を生み出す。サンプルコード1で

のStreamReaderは、DataAvailableを有し、メッセージが受信されたピックアップ。

コードサンプル2にはDataAvailableがないため、メッセージは受信されません。

public void SendMessage(string message) 
    { 
     message = "TestMessage"; 

     //WORKING - Sample 1 
     using (var sw = new StreamWriter(stream)) 
     { 
      sw.Write(message); 
      sw.Flush(); 
     } 
    } 

サンプル2メソッドを書く - - 書く

public void SendMessage(string message) 
    { 
     message = "TestMessage"; 

     //NOT WORKING - Sample 2 
     var encoding = new UTF8Encoding(false, true); 
     using (var sw = new StreamWriter(stream, encoding, 1024, true)) 
     { 
      sw.Write(message); 
      sw.Flush(); 
     } 
    } 
方法を私は2

サンプル1は、試料中のStreamWriteのコンストラクタを使用する必要が故に、オープン私の基本的な流れを維持する必要があります

読み取り方法

public string ReadMessage() 
    { 
     if (!stream.DataAvailable) 
      return null; 

     //I have also tried 
     //if(sr.Peek() == 0) 
     // return null; 

     string message = sr.ReadToEnd(); 
     return message; 
    } 

:私は最後の作業を1と一緒に両方のサンプルを入れた場合、私は、メッセージが、間違いなく、それがtrueにDataAvailableを設定されていませんがストリーミングするために書いているように、「TestMessageTestMessage」を受信し得ますか?

アイデアの理由は何ですか?

+1

作業状態と非稼働状態の完全な例を示してください。 SendMessageとReadMessageの間に何をしているのかを知るのは難しいです。 –

+0

これは質問には直接関係していませんが、https://stackoverflow.com/questions/27961274/reading-information-from-a-port-waits-even-though-data-availableの回答から別のアプローチが得られるかもしれませんDataAvailableプロパティに依存するよりも。 –

+0

writeメソッドを呼び出した直後にreadメソッドを呼び出していますか?この場合、DataAvailableプロパティは、チェックした時点で設定されていない可能性があります。スレッドを入れてみてください。書き込みと読み取りの間にスリープ状態(100)し、正常に機能しているかどうかを確認します。 –

答えて

1

ReadToEnd()コマンドは、終了するまで終了していないNetworkStreamで無期限にブロックする問題です。あなたのコードをテストしたところ、DataAvailableというクエリを通過し、コマンドでブロックされました。

BaseStreamを開いたままにすることができるコンストラクタを使用する方法は、ストリームが終了しないことを意味します。作業メソッドがストリームを閉じると、ReadMessageメソッドはストリーム内のすべてを返します。

解決方法:最後まで読み込まないでください。データが利用可能である間にブロックを読み込むか、終端文字を導入してその文字を読み込みます。 ReadToEnd MSDN:

から

は、それが終わりに達したとき、ストリームが知っていることを前提としています。 ReadToEndは、要求があっても接続を終了しない場合にのみデータを送信する対話型プロトコルの場合、終了に達しないために無期限にブロックされる可能性があります。避ける必要があります。

関連する問題