2014-03-08 5 views
0

MVC 5.1, .NET 4.5Фоновая задача отправить письмо

На нашем простом веб-сайте нам необходимо отправить электронное письмо. Наш почтовый сервис вызывается событием Post back, и он отправляет электронное письмо, а затем создает страницу результатов и возвращает ее.

Это замедляет страницу, так как страница должна ждать отправки синхронного письма.

Если мы запустим электронное письмо в другом потоке, сайт может продолжить создание страницы и вернуть ее пользователю по мере обработки электронной почты или долгое задание приведет к тому, что страница не будет отображаться.

В принципе, могу ли я отправить электронную почту без блокировки по соображениям производительности.

Примечание: мы не можем отправить запрос по электронной почте в службу или другую систему.

+1

['SmtpClient.SendAsync'] (http://msdn.microsoft.com/en-us/library/x5x13z6h (v = vs.110) .aspx)? – dkozl

+0

Простое изменение на smtp.SendMailAsync (сообщение); работал. Вау, это было легко! –

+0

Наверху это не нужно. Если отправка электронной почты замедляет вас более чем на 0,2 секунды, в вашей настройке электронной почты что-то действительно странно - например, не используя локальный сервер ретрансляции. – TomTom

ответ

3

Предполагая, что вы вы используете встроенный в SmtpClient вы можете использовать SmtpClient.SendMailAsync метод

smtpClient.SendMailAsync(new MailMessage{ ... }); 

Посылает указанное сообщение на сервер SMTP для доставки как асинхронный режим

+0

Не разрешено повторять вызов SendMailAsync во второй раз, если первая отправка не завершена. –

+0

@Der_Meister никогда не говорил, что это разрешено. 'SmtpClient' может отправлять только по одному электронному письму за раз. – dkozl

+0

Правильно, это просто предупреждение для читателей. Для многих приложений лучше использовать долгоживущий экземпляр SmtpClient, поскольку он поддерживает открытие SMTP-соединения. Однако необходимо убедиться, что клиент обрабатывает только одно сообщение за раз. –

1

Вызов StartNew функционально эквивалентен созданию задачи с использованием одного из его конструкторов, а затем вызывает метод Task.Start для планирования выполнения задачи.

Task.Factory.StartNew(() => { 
     //do somethings 
}); 

Пример:

Task.Factory.StartNew(() => { 
     SendMail("Hello world", "[email protected]", "TEST"); 
}); 

public static bool SendMail(string subject, string to, string body) 
    { 
     string fromMailAddress = ConfigurationManager.AppSettings["MailAddress"]; 
     string fromMailPassword = ConfigurationManager.AppSettings["MailPassword"]; 
     string fromMailName = ConfigurationManager.AppSettings["MailName"]; 

     var networkConfig = new NetworkCredential(fromMailAddress, fromMailPassword); 
     var mailServer = new SmtpClient() 
     { 
      Host = ConfigurationManager.AppSettings["SmtpHost"], 
      UseDefaultCredentials = false, 
      Credentials = networkConfig 
     }; 
     if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["SmtpPort"])) 
      mailServer.Port = Convert.ToInt32(ConfigurationManager.AppSettings["SmtpPort"]); 

     var message = new MailMessage() 
     { 
      Subject = subject, 
      SubjectEncoding = Encoding.UTF8, 
      IsBodyHtml = true, 
      BodyEncoding = Encoding.UTF8, 
     }; 

     //message send config 
     message.To.Add(new MailAddress(to)); 
     message.From = new MailAddress(fromMailAddress, fromMailName); 
     message.Body = body; 

     try 
     { 
      mailServer.SendAsync(message, null); 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 

     return true; 
    } 
+0

Спасибо за то, что Хади, я нашел smtp.SendMailAsync (сообщение) сделал трюк для всех. –

+1

Это очень много кода, который просто показывает, что некоторые люди все еще не в современном .NET;) Как и в: unneeded. – TomTom

Смежные вопросы