Можно ли передавать объект System.Net.Mail.MailMessage делегату в C #? - PullRequest
5 голосов
/ 28 февраля 2011

Я создал небольшой класс SmtpSender, который обрабатывает отправку объекта Smtp MailMessage.Когда сообщение было отправлено или не удалось отправить, я вызываю делегата, который содержит объект «response», который имеет исходное сообщение MailMessage, которое пользователь пытался отправить вместе с логическим значением success / fail и строкой ошибки.Затем пользователь может повторно отправить объект 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
}

1 Ответ

2 голосов
/ 28 февраля 2011

Когда вы вызываете dispose для Object, вы говорите, что с ним покончено, и что он должен перейти в «сломанное» состояние, которое может быть очищено сборщиком мусора. Так что после его утилизации я не буду использовать его снова. Так что распоряжайтесь им только по окончании.

Последний объект, который будет использовать / трогать класс, должен его утилизировать. Не выбрасывайте это рано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...