SmtpClient.SendAsync обзор кода - PullRequest
2 голосов
/ 19 апреля 2010

Как правильно утилизировать SmtpClient и MailMessage при использовании SendAsync?

Я скопировал мой код ниже.

{
...
var client = new SmtpClient {Host = _smtpServer};
client.SendCompleted += SendCompletedCallback;
var userState = mailMessage;
client.SendAsync(mailMessage, userState);
...
}

private static void SendCompletedCallback(object sender, 
    AsyncCompletedEventArgs e)
{
    // Get the unique identifier for this asynchronous operation.
    var mailMessage= (MailMessage)e.UserState;

    if (e.Cancelled)
    {
        Log.Info(String.Format("[{0}] Send canceled.", mailMessage));
    }
    if (e.Error != null)
    {
        Log.Error(String.Format("[{0}] {1}", mailMessage, e.Error));
    }
    else
    {
        Log.Info("Message sent.");
    }
    mailMessage.Dispose();
}

Удаление MailMessage после client.SendAsync(...) вызывает исключение. Мне нужно избавиться от него в обработчике обратного вызова.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2013

Я думаю, что это может помочь

   client.SendCompleted += (s, e) => { client.Dispose(); message.Dispose(); };
1 голос
/ 19 апреля 2010

Это выглядит правильно.

Обратите внимание, что MailMessage не переопределяет ToString, поэтому ваши журналы просто скажут [MailMessage] Send cancelled.
Вместо этого вы можете использовать Subject proeprty (или другое свойство).

...