Утилизировать SmtpClient в SendComplete?

Когда я использую SendAsync SmtpClient для отправки электронной почты, как мне правильно разместить экземпляр smtpclient?

Скажем:


MailMessage mail = new System.Net.Mail.MailMessage()
{
   Body = MailBody.ToString(),
   IsBodyHtml = true,
   From = new MailAddress(FromEmail, FromEmailTitle),
   Subject = MailSubject
};
mail.To.Add(new MailAddress(i.Email, ""));
SmtpClient sc = new SmtpClient(SmtpServerAddress);
//Add SendAsyncCallback to SendCompleted
sc.SendCompleted += new SendCompletedEventHandler(SendAsyncCallback);
//using SmtpClient to make async send (Should I pass sc or mail into SendAsyncCallback?)
sc.SendAsync(mail, sc);

В методе SendAsyncCallback следует вызывать sc.Dispose() или mail.Dispose()?

Я проверил документ MSDN, один пример вызывает MailMessage.Dispose(), но будет ли этот метод dispose также удалять экземпляр SmtpClient?


person Jeff Chen    schedule 14.04.2011    source источник


Ответы (2)


Вы должны разместить как MailMessage, так и SmtpClient в SendAsyncCallback.

Удаление MailMessage не приведет к автоматическому удалению SmtpClient (поскольку вы можете захотеть отправить два сообщения с одним и тем же SmtpClient, и вы не хотите, чтобы клиент удалялся сразу после удаления первого сообщения).

person Bradley Grainger    schedule 19.05.2011
comment
Как вы получаете доступ к MailMessage изнутри SendAsyncCallback, чтобы Dispose его? Если мы сделаем его глобальной переменной (полем), мы обязательно столкнемся с коллизиями (в данном случае приложение MVC). - person InteXX; 24.09.2020
comment
Я смог сделать это, отправив MailMessage в качестве токена для второго параметра SendAsync(). - person InteXX; 24.09.2020

Этот пример: из документации библиотеки MSDN только закрывает сообщение, поэтому я использую это в своей реализации: Метод SmtpClient.SendAsync

message.Dispose();

Я столкнулся с этой проблемой, упомянутой в этом вопросе, когда отправка всегда отменялась, поэтому я удаляю свой оператор using {}: Вызовы SmtpClient.SendAsync автоматически отменяются

Хорошо, я только что попытался выдать message.Dispose(), и даже это выдавало ошибку, говорящую о том, что не может отправить электронное письмо из-за удаления сообщения. Возможно, потому что у меня приложение asp.net mvc, а пример — консольное приложение. В любом случае сборщик мусора должен выбрать эти параметры, как только все выйдет за рамки...

person Nathan Prather    schedule 28.01.2013