クラスが別のエンティティに破棄されたことを通知したいという非常に興味深いシナリオがあります。しかし、それも私が望むことをしていません。
問題
デコンストラクターは、何らかの理由で、本来行うべきことを行いません。
質問
デストラクタが呼び出されないのはなぜですか。必要なクリーンアップが行われることを確認してください。
コード
ここに情報提供者がいます〜
class Connection
{
public const int Port = 50000;// Can be any range between 49152 and 65536
//Teh Constructor
public Boolean Connect()
{
//SetInformation
Information.Id = 545;
using (var WebServ = new ClientSDKSoapClient("ClientSDKSoap"))
{
ContinueConnection.WaitOne();
WebServ.ClientLogin(Information);
}
return true;
}
~Connection()
{
using (var WebServ = new ClientSDKSoapClient("ClientSDKSoap"))
{
WebServ.ClientLogout(Information);
}
}
}
追加情報
接続クラスが何らかの理由で破棄された場合、Web サービスに記録させたいと考えています。クライアントが接続しているときは、完全に機能します。Web サービスは、呼び出されたすべてのメソッドを記録します。ClientLogout を明示的に呼び出すと、機能します。
IDisposable を実装できることは承知しています。ただし、このオブジェクトは、1 つのメソッドの存続期間内で使用されることを意図していません。実際、それはプログラムの全期間にわたって使用されることを意図しており、このオブジェクトの失敗は基本的にプロジェクト全体の失敗につながります。(メインISはメソッドだと思いますが...)
ネットワーク接続を解放する必要があります。ただし、このプログラムではなく、別のプログラムであり、ClientLogout が呼び出されない限り解放されません。
私の研究
Microsoftは、ネットワーク接続を明示的に参照するアンマネージ リソースの解放にはデコンストラクタを使用する必要があると述べています。これはかなり困惑しました。