Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么SmtpClient.SendAsync挂起?_C#_Asp.net_Smtpclient - Fatal编程技术网

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给出了这些异常的原因。