C# 为什么SmtpClient.SendAsync挂起?
我正在使用C# 为什么SmtpClient.SendAsync挂起?,c#,asp.net,smtpclient,C#,Asp.net,Smtpclient,我正在使用SmtpClient.SendAsync(C#)在ASP.NET web应用程序和服务中发送电子邮件。web应用程序/服务使用IIS 8在Windows Server 2012 R2上运行 有时,对SendAsync的调用会挂起,并且似乎不会异步发送邮件消息,因此调用线程会阻塞。这种行为似乎是零星的。我无法在测试环境中复制该问题。当通过调用web方法发送电子邮件时,这尤其有问题,因为超时时间为60秒(正是出于这个原因,我使用了sendsync,这样客户端就不会遇到任何时间延迟) 这是我
SmtpClient.SendAsync
(C#)在ASP.NET web应用程序和服务中发送电子邮件。web应用程序/服务使用IIS 8在Windows Server 2012 R2上运行
有时,对SendAsync
的调用会挂起,并且似乎不会异步发送邮件消息,因此调用线程会阻塞。这种行为似乎是零星的。我无法在测试环境中复制该问题。当通过调用web方法发送电子邮件时,这尤其有问题,因为超时时间为60秒(正是出于这个原因,我使用了sendsync
,这样客户端就不会遇到任何时间延迟)
这是我的代码片段
SmtpClient client;
MailMessage msg;
public void SendMail()
{
try
{
client = new SmtpClient("smtpAddress@mydomain.com");
msg = new MailMessage();
msg.Subject = "Test";
msg.Body = "This is the body";
msg.From = "noreply@example.com";
msg.To.Add("me@example.com");
client.SendCompleted += new SendCompletedEventHandler(sendCompletedCallback);
client.SendAsync(msg, "Test");
}
catch (Exception ex)
{
// Log error
}
}
private void sendCompletedCallback(object send, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
// Log error
}
else if (e.Cancelled)
{
// Log cancellation
}
else
{
// Log success
}
client.Dispose();
msg.Dispose();
}
为什么对SendAsync的调用有时会挂起并阻止调用线程?请查看下面的链接,
可能有两种情况,一种是在尝试发送另一封电子邮件之前未等待电子邮件传输完成
或
收件人无效,事实上不应该如此。为什么你说它会阻止你的调用线程?在
Release
模式下运行它,查看它是否仍然阻塞。使用断点进行调试时,异步调用的行为不同。幕后的编译器会给你一种调试普通方法的感觉。邮件未发送可能是您的SMTP服务器的问题。我发现其他一些实例在联机时以这种方式运行,但没有令人满意的答案。最常用的解决方法似乎是将其包装在对ThreadPool.QueueUserWorkItem
@Rahul的调用中。我知道它会阻塞,因为在我的web服务中调用SendAsync之后,我有额外的日志记录,并且我没有看到这些日志消息。我只在发布模式下部署到生产环境。似乎表明,如果要发送多条消息,则必须等待前一条消息完成,然后才能发送下一条消息。后续调用将被阻止,直到前一个调用完成。如果这两个调用都是我的问题的原因,那么如果消息确实是异步发送的,为什么调用线程会被阻止?每次发送电子邮件时,我都会创建一个SmtpClient类的新实例,因此在第一次发送完成之前,我不应该收到任何发送另一条消息的冲突。我也没有收到SmtpException,如果其中一个收件人无效,则应抛出该异常。如果您有一个GUI,其中发送电子邮件需要等待一段时间,则使用client.SendAsync
是有意义的,因为它不会冻结UI。如果您是从批处理作业或控制台应用程序执行此操作,那么我看不到使用client.SendAsync
有任何好处。您可以在代码中测试上述情况。至少MSDN给出了这些异常的原因。