2009-07-20 23 views
1
私は、サーバーへの接続を処理し、クライアントからデータを読み取るためのコードのこの部分を使用してい

は、ReceiveMessageメソッドはBeginRead()を呼び出しますしかし、私はObjectDisposedExceptionを取得しています。れるtcpClientとNetworkStream処分問題

解決策はストリームをもう必要としないときにstream.Dispose()を呼び出すことですが、実際にはusing節の使用を維持できる解決策を探しています。

using (var client = _listener.EndAcceptTcpClient(ar)) 
{ 
    var clientStream = client.GetStream(); 

    using (var eh = new ManualResetEvent(false)) 
    { 
     // Get the request message 
     Messages.ReceiveMessage(clientStream, msg => 
      { 
       ProcessRequest(msg, clientStream); 
       eh.Set(); 
      }); 

     eh.WaitOne(); 
    } 
} 

1つの警告: - ので、それは再利用できるように(クラスのインスタンス)どこでも良識があるのならば、そう、ManualResetEventを格納するためにあなたがこれを行うことができます

おかげ

答えて

3

ここには2つの可能性があります。

まず、この非同期プロセスを実行し、完了するまでブロックして、usingステートメントを保持できるようにします。これはアプローチsuggested by Ben M hereです。

また、usingステートメントを削除して、クライアント変数を自分で処分することもできます。これはコンパイラの構文を使用するよりも面倒かもしれませんが、現在この状況で利用しようとしている非同期動作を維持し、ブロックが不要になるという利点があります。しかし、これはあなたが変数を格納し、適切な場所に(おそらくデリゲートの最後にそれを処分する必要がありますが、デリゲートが呼び出されない場合に備えて、後でそれをチェックする必要があります)。

C#での "using"ステートメントは素晴らしいですが、適切でない状況があります(非同期動作を維持する必要がある場合)。

2

これらの多くを作成/破棄することはちょっとしたお尻になる可能性があります。

また、私はあなたの投稿に記載された動作から、ReceiveMessage()が非同期操作であると仮定していることにも注意してください。

+0

ManualResetEventはIDisposableを実装していますので、このパターンはusingステートメントでラップする必要があります。 – Joe

+0

これは、非同期プロセスが完了するまで基本的にブロックしているので、データの非同期処理を「中断」します。それはすべての状況において望ましくないかもしれません。 –

+0

私はこの制限内で質問に答えました。 :-) JoeはManualResetEventの使用について()を使用する権利を持っています。 –

関連する問題