异步方法与System.Net.Mail.SmtpClient的同步方法的响应时间大致相同?

时间:2012-10-31 09:40:56

标签: c# asp.net asp.net-mvc email asynchronous

我们在调用特定MVC控制器方法时发送电子邮件。代码如下。在浏览器内对AJAX响应时间进行基准测试时,我们发现client.SendAsync(mail, null)client.Send(mail)实现大约需要相同的时间,即完全不发送邮件的时间为1.8秒。

public ActionResult jsonPosted(int? id, SomeDataClass data)
{   
    ...

    // NOTE: remode 'using' statement for Async calls
    // else no email ever sees light
    using (SmtpClient client = new SmtpClient())
    {       
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("name@server.com", "password");
        client.Port = 587;
        client.Host = "smtp.server.com";
        client.EnableSsl = true;

        MailMessage mail = new MailMessage();
        mail.From = new MailAddress("admin@server.com");
        mail.To.Add("sales@server.com");
        mail.Subject = "Coming soon: user " + newUser.Email + " registered on list";
        mail.Body = "Email address is : " + newUser.Email + "\n";
        mail.Body += "Date of signup is : " + newUser.SignupTime.ToString();

        try
        {
            // Both take about 1.9 seconds ?!?!
            //client.SendAsync(mail, null);
            client.Send(mail);
        }
        catch (SmtpException e)
        {
            // bad smtp, no mail for you
        }
    }
    ...
    return Json(dataIndependentOfEmail);
}

问题:

  1. 为什么这两种方法需要同时进行?异步应该立即返回,而Sync应该阻止整个处理时间,对吗?据我所知,Async在工作期间消耗了另一个线程和那个线程阻塞。但是至少第一个线程上的用户应该看到性能提升。
  2. 如何正确使用using在异步模式下处理SmtpClientMailMessage等类?

1 个答案:

答案 0 :(得分:0)

有关async smtpclient上的msdn示例,请参阅here 在这个例子中,他们没有使用dispose(这是一个小猜测),using将等待异步操作完成。
出于测试目的尝试删除using语句,我希望sendAsync比发送更快 当然你没有正确地处理smtpclient对象,处理处理的一种方法是创建一个新线程来处理旧skool方式的电子邮件。你不会有SendAssync的清洁,但至少你确定用户得到即时反馈+ smtpclient正确处理。

编辑:一个更好的解决方案是使用事件sendcompleted并在那里配置smtpclient 请参阅here了解示例