シリアルポートのDataReceivedイベントを模倣するシステムを実装しました。これにより、TCPClientオブジェクトのNetworkStreamからのデータの読み取りは、BeginRead()別のスレッドからの次のメソッドを呼び出しますC#でBeginRead()を呼び出した後にNetworkStreamを閉じる
TcpClient server = new TcpClient();
server.Connect(IPAddress.Parse(ip), 10001);
server.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DataReceived), server.GetStream());
は:
private void DataReceived(IAsyncResult result)
{
res = result;
server.GetStream().EndRead(result);
//append received data to the string buffer
stringBuffer += System.Text.ASCIIEncoding.ASCII.GetString(buffer);
//clear the byte array
Array.Clear(buffer, 0, buffer.Length);
//trigger the parser
waitHandle.Set();
server.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DataReceived), buffer);
}
これは正しく動作しているように見えます。私は問題のないネットワーク上のデバイスにデータを送受信できます。しかし、私は次のメソッドを使用して接続を切断しようとすると、プログラムがクラッシュ:
public override void disconnect()
{
server.Close();
}
これは、次のエラーがスローされます。
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
は、私はまた、次のようにdisconnectメソッドを実装しようとしている:
server.GetStream().Close();
この結果、次のエラーが発生します。
A first chance exception of type 'System.InvalidOperationException' occurred in System.dll
これは、BeginRead()メソッドが呼び出され、EndRead()メソッドが呼び出されていないという事実と関係があります。その場合、ストリームをクラッシュさせずにストリームを閉じることはできますか?
EndRead()呼び出しのまわりでtryブロックを使用して、ObjectDisposedExceptionを捕捉できるようにする必要があります。ソケットが予期せず閉じられたことを示す信頼できる指標です。 –
私はこの問題を発見しました。 EndRead()メソッドとBeginRead()メソッドの呼び出しがtry/catchブロックに囲まれていないため、 '' System.ObjectDisposedException ''を取得していました。ストリームを閉じたとき、これらのメソッドはもはや存在しなかったオブジェクトで実行しようとしていました。 – isometrik
これらの回答を確認してください。それらは同じ質問に関するものです:http://stackoverflow.com/questions/43096943/how-to-stop-reading-from-networkstream/43101953#comment73305491_43101953 –