0

非同期呼び出し NetworkStream.BeginRead (非同期コール バック デリゲートを渡す) を介して読み取られている TCP クライアント ストリームを取得しました。問題は、接続がいつダウンしたかを検出することです。現在、接続が切断された場合、BeginRead 呼び出しはイーサに消えます。コールバックは呼び出されません。ダウン中にアプリがストリームで送信を試みると、コールバックトリガーされ、NetworkStream.EndRead が例外をスローします。これは問題ありませんが、送信が発行されない場合、アプリは接続がダウンしていることに気づかずにそのまま待機します。

最初に、NetworkStream.ReadTimout が設定されていない (つまり、デフォルトの Timout.Infinite である) ことがわかりましたが、これを (たとえば、3000ms に) 設定しても役に立ちませんでした。[編集: MSDN doc は、ReadTimeout が非同期の BeginRead ではなく同期読み取り呼び出しにのみ適用されることを明確に述べています - 以前にもっと注意深く確認する必要がありました :-( ]

クライアント接続が失敗したことを検出する方法は?

この SO questionに示されているように、基になるソケットをポーリングする必要がありますか?

さらに、接続が物理的に再確立されても、コールバックはまだ呼び出されません。送信を試みるまで、イーサ内で待機するだけです。

4

1 に答える 1

0

私は、TcpClient asyncBeginReadから、専用の読み取り TheadReadでタイムアウトを伴う同期に変更する必要がありました。

これにより、ストリームにデータがないためにタイムアウトになったときにイベントを発生させることができました。

于 2012-04-11T14:08:37.127 に答える