0

クラスが別のエンティティに破棄されたことを通知したいという非常に興味深いシナリオがあります。しかし、それも私が望むことをしていません。

問題

デコンストラクターは、何らかの理由で、本来行うべきことを行いません。

質問

デストラクタが呼び出されないのはなぜですか。必要なクリーンアップが行われることを確認してください。

コード

ここに情報提供者がいます〜

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は、ネットワーク接続を明示的に参照するアンマネージ リソースの解放にはデコンストラクタを使用する必要があると述べています。これはかなり困惑しました。

4

2 に答える 2

3

Dispose不明瞭なデコンストラクターの比喩に頼るのではなく、Connection クラスのパターンを実装する必要があると思います。これは、それを行うための「標準的な」方法です。

public class Connection : IDisposable  // <== Inherit from IDisposable interface
{
    public const int Port = 50000;// Can be any range between 49152 and 65536

    private SomeType webserv; // Use whatever real type is appropriate here.
    private Information information = new Information();  // or whatever

    // This is a real constructor.
    public Connection()
    {
        //SetInformation
        information.Id = 545;

        webServ = new ClientSDKSoapClient("ClientSDKSoap"))
        webserv.ContinueConnection.WaitOne();
        webServ.ClientLogin(information);
    }

    // Implement IDisposable interface
    public void Dispose()
    {
        webServ.ClientLogout(information);
    }
}

そして、それをこのように使用します

using (var connection = new Connection())
{
    // Use the connection here.
}

usingブロックを離れると、クライアントはログアウトされます。

于 2013-08-23T21:04:23.040 に答える