Wir haben einen (synchronen) E-Mail-Code, der eine Klasse erstellt, die einen SmtpClient erstellt und dann eine E-Mail sendet. Der SmtpClient wird nicht wiederverwendet; jedoch erhalten wir die folgende Ausnahme ab und zu:Warum erhalten wir regelmäßig "Ein asynchroner Anruf ist bereits in Bearbeitung" beim Aufruf von 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
-Code sieht wie folgt aus:
// ...
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);
}
}
Oder anstatt eine neue SmtpClient-Instanz zu erstellen, kann das OP dieses Objekt einfach sperren, bis die Nachricht gesendet wird. – Marco
Ja, es gibt einen guten Grund, den Client im Konstrukt zu erstellen: Wenn Sie mehrere E-Mails an denselben Server senden, werden die Verbindungen gepoolt. Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.dispose.aspx –
@ErnodeWeerd: Sehen Sie den aktualisierten Code. – jgauffin