У нас есть (синхронный) код электронной почты, который создает класс, который создает SmtpClient, а затем отправляет электронное письмо. SmtpClient не используется повторно; Однако мы получаем следующее исключение каждый сейчас и потом:Почему мы периодически получаем «Асинхронный вызов уже выполняется» при вызове SmtpClient.Send?
System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.InvalidOperationException: An asynchronous call is already in progress. It must be completed or canceled before you can call this method.
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at EmailSender.SendMail(MailAddress fromMailAddress, string to, String subject, String body, Boolean highPriority) in ...\EmailSender.cs:line 143
код выглядит следующим образом:
// ...
var emailSender = new EmailSender();
emailSender.SendMail(toEmail, subject, body, true);
// emailSender not used past this point
// ...
public class EmailSender : IEmailSender
{
private readonly SmtpClient smtp;
public EmailSender()
{
smtp = new SmtpClient();
}
public void SendMail(MailAddress fromMailAddress, string to, string subject, string body, bool highPriority)
{
if (fromMailAddress == null)
throw new Exception();
if (to == null)
throw new ArgumentException("No valid recipients were supplied.", "to");
// Mail initialization
var mailMsg = new MailMessage
{
From = fromMailAddress,
Subject = subject,
Body = body,
IsBodyHtml = true,
Priority = (highPriority) ? MailPriority.High : MailPriority.Normal
};
mailMsg.To.Add(to);
smtp.Send(mailMsg);
}
}
Или вместо создания нового экземпляра SmtpClient OP может просто заблокировать этот объект, пока сообщение не будет отправлено. – Marco
Да, есть хорошая причина для создания клиента в конструкторе: при отправке нескольких писем на те же серверные соединения будут объединены. См. Раздел замечаний на http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.dispose.aspx –
@ErnodeWeerd: см. Обновленный код. – jgauffin