为什么SmtpClient.SendAsync会挂起?

时间:2016-08-10 16:59:23

标签: c# asp.net smtpclient

我正在使用SmtpClient.SendAsync(C#)在ASP.NET Web应用程序和服务中发送电子邮件。 Web应用程序/服务使用IIS 8在Windows Server 2012 R2上运行。

有时候SendAsync的调用会挂断,并且似乎不会异步发送邮件消息,因此调用线程会阻​​塞。这种行为似乎是零星的。我无法在测试环境中复制问题。这是因为调用Web方法而发送电子邮件时特别有问题,因为超时是60秒(我正在使用SendAsync因为这个原因所以客户端不会遇到任何时间延迟)。

这是我的代码段。

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的调用会挂起并阻塞调用线程?

1 个答案:

答案 0 :(得分:1)

请查看以下链接, https://msdn.microsoft.com/en-us/library/x5x13z6h(v=vs.110).aspx 可能有两种情况,要么在尝试发送另一封电子邮件之前没有等待电子邮件传输完成 要么 收件人无效