0

所以我有一个典型的网络表单,我注意到在我到达下一个屏幕之前提交表单时有很长的延迟。在玩了之后,我发现是 MailMessage 部分导致了延迟。我希望有人看看这个,并就如何改进它以加快我的提交速度给我一些建议。

代码背后

protected void Submit_Click(object sender, EventArgs e)
    {
         blah blah blah...

        StringBuilder sb = new StringBuilder();
        sb.Append("<html><body>");
        sb.Append("Success!!");
        sb.Append("</body></html>");
        MailMessage msg = new MailMessage();
        SmtpClient server = new SmtpClient("");
        msg.To.Add(toaddress);
        msg.From = new MailAddress(fromaddress, fromname);
        msg.Subject = "New Submission";
        msg.Body = sb.ToString();
        msg.IsBodyHtml = true;
        server.Send(msg);

        messageLabel.Text = "Your submission has been sent!";
        messageLabel.Visible = true;
   }

有什么办法可以加快速度吗?我最大的问题是人们没有想到他们点击了提交,他们又点击了它。我知道我可以在他们点击提交按钮后将其灰显,但我希望能获得一些我以前不知道的速度改进。

4

2 回答 2

3

我经常参与具有大规模邮件发送需求的部署。你是对的 - 电子邮件确实会大大降低应用程序的速度,这就是我们从不直接从应用程序本身发送电子邮件的原因。

我们也很少在大型应用程序中使用多线程——只是没有足够的线程来运行。

我们总是选择两个选项之一,两者都可以很好地扩展:

  1. 消息队列,例如 MSMQ。将电子邮件写入消息队列,然后让一个或多个“服务器”接收出站邮件。可以无限添加服务器。企业可扩展性。

  2. 数据库。将您的电子邮件写入数据库,然后继续。编写一个单独的应用程序或服务来接收电子邮件和进程。同样,可以很好地扩展,但通常不如消息队列好。

这两种方法还有一个非常有用的好处:交易。您可以将这两个选项包装在 TransactionScope 中,这意味着,如果在此过程中出现任何其他问题,您可以在电子邮件实际发送之前回滚。

只有 100% 已提交的交易最终被翻译成出站电子邮件。

没有什么比向客户发送电子邮件更糟糕的了:“谢谢,您的订单已发送”,然后在处理流程中发现您实际上缺货了!

希望这可以帮助。

于 2013-10-22T23:46:59.503 回答
0

在将结果呈现给用户的同时,在单独的线程上执行邮件提交。如果消息提交失败,则将电子邮件写入本地磁盘,以便在进程终止时查看一些内容。

在应用程序状态或静态字段中存储对消息发送结果的引用,以便用户稍后可以查看消息发送是否成功。

于 2013-10-22T21:52:47.003 回答