5

SmtpMailMessageオブジェクトの送信を処理する小さなSmtpSenderクラスを作成しました。メッセージが送信されたとき、または送信に失敗したとき、ユーザーが送信しようとした元のMailMessageと、成功/失敗のブール値およびエラー文字列を持つ'response'オブジェクトを含むデリゲートを発生させます。その後、ユーザーはMailMessageオブジェクトを送信者クラスに再送信して、必要に応じて再試行できます。

私が知りたいのは...管理されていないリソースを持つオブジェクトを含むデリゲートを作成した場合、現在のスコープでオブジェクトを破棄する必要がありますか?もしそうなら、現在のスコープでDisposeを呼び出すと、デリゲート関数が受け取るオブジェクトが強制終了されますか?ここで長期的にはメモリリークが心配です。

アドバイスや助けをいただければ幸いです。前もって感謝します!

デイブ

public delegate void SmtpSenderSentEventHandler(object sender, SmtpSendResponse theResponse);

public class SmtpSendResponse : IDisposable
{
    #region Private Members

    private MailMessage _theMessage;
    private bool _isSuccess;
    private string _errorMessage;

    #endregion

    #region Public Properties

    public MailMessage TheMessage
    {
        get { return _theMessage; }
        set { _theMessage = value; }
    }

    public bool IsSuccess
    {
        get { return _isSuccess; }
        set { _isSuccess = value; }
    }

    public string Error
    {
        get { return _errorMessage; }
        set { _errorMessage = value; }
    }

    #endregion

    #region Constructors

    public SmtpSendResponse(MailMessage theMessage, bool isSuccess)
        : this(theMessage, isSuccess, null)
    { }

    public SmtpSendResponse(MailMessage theMessage, bool isSuccess, string errorMessage)
    {
        _theMessage = theMessage;
        _isSuccess = isSuccess;
        _errorMessage = errorMessage;
    }

    #endregion

    #region IDisposable Members

    public void Dispose()
    {
        if (_theMessage != null)
        {
            _theMessage.Attachments.Dispose();
            _theMessage.Dispose();
        }
    }

    #endregion
}
4

1 に答える 1

2

Object に対して dispose を呼び出すと、処理が完了し、ガベージ コレクターによってクリーンアップできる「壊れた」状態になる必要があると言えます。そのため、一度処分すると、二度と使用しません。したがって、使い終わったら廃棄してください。

クラスを使用/タッチする最後のオブジェクトは、それを破棄する必要があります。早く処分しないと。

于 2011-02-28T12:49:06.290 に答える