Простая концепция здесь.Это для сайта, созданного с использованием MVC 3 и Entity Framework 4. После того, как пользователь зарегистрировался на сайте, на его электронный адрес отправляется электронное письмо.Сначала я реализовал это с помощью SmtpClient.Send (), и он работал нормально.Затем мне пришла в голову блестящая идея попробовать отправить письмо асинхронно.У меня возникли проблемы с двумя асинхронными подходами, которые я пробовал.
Первая реализация (из этого оставшегося без ответа поста: https://stackoverflow.com/questions/7558582/how-to-dispose-using-smtpclient-send-and-asynccallback):
public bool Emailer(){
.
.
.
using (var smtpClient = new SmtpClient())
{
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("myaddress@gmail.com", "mypassword");
var sd = new SendEmailDelegate(smtpClient.Send);
var cb = new AsyncCallback(SendEmailResponse);
sd.BeginInvoke(message, cb, sd);
return true;
}
}
private delegate void SendEmailDelegate(System.Net.Mail.MailMessage m);
private static void SendEmailResponse(IAsyncResult ar)
{
try
{
SendEmailDelegate sd = (SendEmailDelegate)(ar.AsyncState);
sd.EndInvoke(ar); // "cannot access a disposed object" errors here
}
catch (Exception e)
{
_logger.WarnException("Error on EndInvoke.", e);
}
}
Это сработало половину времени. Другая половинаЯ получаю сообщение об ошибке «Не удается получить доступ к удаленному объекту» в CallBack.
Следующая реализация (от участника с солидной репутацией: Каковы оптимальные методы использования SmtpClient, SendAsync и Dispose в .NET 4.0):
var smtpClient = new SmtpClient();
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("myaddress@gmail.com", "mypassword");
smtpClient.SendCompleted += (s, e) =>
{
smtpClient.Dispose();
message.Dispose();
};
smtpClient.SendAsync(message, null);
В этой реализации я не получаю никаких ошибок, но при выполнении отладки smtpClient.SendAsync () заметно заметно увеличивается задержка (~ 5 секунд), что заставляет меня думать, чтоон не отправляется асинхронно.
Вопросы:
1) что не так в первом методе, который вызывает ошибки «удаленного объекта»?
2) есть ли во второй реализации проблема, из-за которой электронная почта не отправляется асинхронно?Является ли 5-секундная задержка бессмысленной?
Возможно также важно отметить, что, хотя сайту не нужно будет поддерживать отправку большого количества электронных писем (только регистрация пользователей, подписка на рассылку и т. Д.), Мы делаемпредвидеть большое количество пользователей в будущем, поэтому мое решение отправлять электронные письма асинхронно.
Спасибо.