2011-06-29 21 views
1

私はアプリケーションがシャットダウンするまでメモリに保持されているWCFプロキシをインスタンス化する.NETアプリケーションを持っています。プロキシを参照するシングルトンサービスエージェントを考えてください。つまり、プロキシは連続したサービス呼び出しのために再利用されます。 proxy.Dispose()への明示的な呼び出しやブロックの使用はありません。アプリケーションのシャットダウン前にWCFプロキシが解放されていないリソースが解放されていますか?

質問は、私はリソースを漏らしていますか?私が言うことができる限り、.NETのガベージコレクションは、これがメモリをリークするのを防ぎます(プロキシは管理されていますか?)。他に何か - ネットワーク接続、ポートなど?

編集:アイテムはアプリケーション外の別のプロセスに保持されていません。

答えて

1

共有メモリなどのグローバルリソースを割り当てていない限り、アプリケーションが終了すると、Windowsはすべてのソケットを閉じ、プログラムに割り当てられたすべてのメモリを解放します。あなたのプログラムが完全に終了していないことが原因である可能性があります(タスクマネージャをチェックしてください)。

1

アプリケーションがシャットダウンすると、処理中のものは再利用されます。このアイテムはアプリケーション外の別のプロセスで保持されていますか?

+0

いいえ、私のアプリケーションプロセスの外には何もありません。 – ogborstad

0

クライアントが完了したときに常に を使用してプロキシを閉じる場合は、をお勧めします。プロキシを閉じると、サービスに接続されている接続が解放されます。これは、トランスポートセッションがある場合に特に重要なものです( )。また、クライアントのマシン上の接続の最大数がしきい値に達するのを防ぐのに役立ちます。

シングルトンサービスを閉じる場合、クライアントプロキシは、シングルトンコンテキストと内部のインスタンスではなく、トランスポートセッションのみを終了します。シングルトン サービスがセッションなしの契約をサポートしている場合、これらの契約は通話ではなく、 も同じインスタンスに接続されます。その性質上、シングルトンは共有されます。 と各クライアントは、単に独自のプロキシまたはプロキシを作成する必要があります。プロキシを閉じてはシングルトンを終了しませんでした。

1

プロキシは管理されていますが、接続は維持されている可能性があります。そのため、プロキシはIDisposableを実装しています。

一般的な話は、オブジェクトがIDisposableを実装する場合、それを処分する必要があるということです。

アプリケーションが終了すると、プロキシは終了しますが、保持しているリソース(開いている接続など)は、プロキシがガベージコレクタによって実際にクリーンアップされるまで終了しません。

ロングストーリーショート:使い捨てのオブジェクトでは常にDisposeを呼び出します。

関連する問題