2009-06-16 10 views
4

私は、コンストラクタが呼ばれクライアント側で「閉じる」メソッドを呼び出さずにクライアントアプリケーションを閉じるときにWCFがオブジェクトを破棄しないのはなぜですか?

AVService client = new AVService(); 
client.Foo(); 

を次のように私は、クライアント側でオブジェクトを作成する場合

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
    public class AVService : IAVService 
    { 
     static int _numberofInst = 0; 
     public AVService() 
     { 
      ++_numberofInst; 
      Console.WriteLine("Number of instances "+_numberofInst); 
     } 
     ~AVService() 
     { 
      --_numberofInst; 
      Console.WriteLine("Number of instances " + _numberofInst); 
     } 
     public void Foo(){} 
    } 

を次のようにネットのTCP WCFサービスがありますが、私は呼び出さずに、クライアントアプリケーションを閉じると、 close mehotd、デストラクタは呼び出されていませんか?どうして?これはサービスオブジェクトがまだサーバー上で動作していることを意味しますか?

答えて

3

はい - 明示的にクライアントを処分しないと、サーバーは(PerSessionモードを指定しているため)しばらくの間ハングします。

最終的にタイムアウトします(バインド設定のInactivityTimeout設定で指定されています)、破棄されます。しかし、時間がかかることがあります(設定に応じて数分から数時間)。

<bindings> 
    <netTcpBinding> 
     <binding name="NetTcp_Reliable" receiveTimeout="00:20:00"> 
     <reliableSession enabled="true" ordered="false" 
          inactivityTimeout="00:15:00" /> 
     </binding> 
    </netTcpBinding> 
</bindings> 

したがって、それは常にアプリを閉じる前に、あなたのクライアントを処分のベストプラクティスです。

+0

いいえ、しかしinactivityTimeoutはクライアント構成ファイルに入れられます。これは、接続が確立されたときにクライアント側の構成がサーバー側に送信されることを意味します。 –

+0

また、あなたのサーバーの設定に入れることもできます。セッションがまだ生きていれば、どちらか短い方が勝ちます。 –

関連する問題