5

私の現在の名前付きパイプの実装は次のようになります。

while (true)
{
  byte[] data = new byte[256];                        
  int amount = pipe.Read(data, 0, data.Length);
  if (amount <= 0)
  {
      // i was expecting it to go here when a client disconnects but it doesnt
     break;
  }
  // do relevant stuff with the data
}

クライアントの切断を正しく検出するにはどうすればよいですか?

4

3 に答える 3

2

NamedPipeClientStream.IsConnected読み取りタイムアウトを設定し、タイムアウトが発生したときにフラグをポーリングします。

読み取りタイムアウトにより、タイムアウト期間アイドル状態の読み取りがスローされますInvalidOperationException

読み取りを行っておらず、切断を検出したい場合は、パイプ接続の存続期間中、ワーカー スレッドでこのメソッドを呼び出します。

while(pipe.IsConnected && !isPipeStopped) //use a flag so that you can manually stop this thread
{
    System.Threading.Thread.Current.Sleep(500);
}

if(!pipe.IsConnected)
{
    //pipe disconnected
    NotifyOfDisconnect();
}
于 2013-09-12T08:30:23.883 に答える
1

パイプが (リモートで) 壊れているかどうかを確認する簡単な方法の 1 つは、常に同期読み取りではなく非同期読み取りを使用し、常に少なくとも 1 つの読み取りを非同期で送信することです。つまり、読み取りが成功するたびに、別の読み取りを行うかどうかに関係なく、別の非同期読み取りを投稿します。パイプを閉じるか、リモート エンドがパイプを閉じると、非同期読み取りが完了したことがわかりますが、読み取りサイズは null になります。これを使用して、パイプの切断を検出できます。残念ながら、パイプにはまだ IsConnected が表示されているため、手動で閉じる必要があると思いますが、何かがおかしくなったことを検出できます。

于 2016-03-07T07:48:35.577 に答える