所以我有一个典型的网络表单,我注意到在我到达下一个屏幕之前提交表单时有很长的延迟。在玩完之后我发现它是导致延迟的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;
}
有什么办法可以加快速度吗?我最大的问题是人们没有想到他们点击了提交,他们再次点击它。我知道点击它后我可以将提交按钮变灰但我希望能提高速度,我以前没有意识到。
答案 0 :(得分:3)
我经常参与大规模邮件发送要求的部署。你是对的 - 电子邮件确实会大大降低应用程序的速度,这就是我们永远不会直接从应用程序本身发送电子邮件的原因。
我们也很少在大型应用程序中使用多线程 - 没有足够的线程可以绕过。
我们总是选择两个选项中的一个,两者都很好地扩展:
消息队列,例如MSMQ。将电子邮件写入消息队列,然后让一个或多个“服务器”接收出站邮件。可以无限添加服务器。企业的可扩展性。
<强>数据库即可。将您的电子邮件写入数据库,然后继续。编写一个单独的应用程序或服务来获取电子邮件和进程。同样,可以很好地扩展,但通常不如消息队列。
这两种方法都有一个非常有用的好处:交易。您可以在TransactionScope中包装这两个选项,这意味着,如果在此过程中出现任何其他错误,您可以在电子邮件实际发送之前回滚。
只有100%已提交的交易最终会被转换为出站电子邮件。
没有什么比向客户发送电子邮件更糟糕的了“谢谢,您的订单已被发送”,然后在处理管道中发现您实际上已经缺货!
希望这有帮助。
答案 1 :(得分:0)
在将结果呈现给用户时,在单独的线程上执行邮件提交。如果邮件提交失败,请将电子邮件写入本地磁盘,以便在进程终止时查看。
在应用程序状态或某个静态字段中存储对消息发送结果的引用,以便用户可以查看稍后是否成功发送消息。