【发布时间】:2023-03-18 18:13:01
【问题描述】:
我有一个联系人表单,它将联系人模型的序列化版本记录到数据库中,并发送一封包含表单数据的电子邮件。在这两个动作之间,最多需要 2 秒才能完成。虽然时间不多,但足以惹恼不耐烦的用户。
联系人:
public class ContactController : Controller
{
// GET: Contact
public ActionResult Index()
{
return View();
}
// Post: /Contact/
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(Models.ContactModel contact)
{
if (ModelState.IsValid)
{
XmlSerializer xmlSerializer = new XmlSerializer(contact.GetType());
using (StringWriter textWriter = new StringWriter())
{
xmlSerializer.Serialize(textWriter, contact);
Log.Create("email", textWriter.ToString());
}
Smtp.sendMail(sendTo, contact.Email, contact.Name, subject, contact.Comment,
ipAddress, senderEmail, contact.Phone, sendBcc);
// using RedirectToRoute instead of RedirectToAction so that /contact is used.
return RedirectToRoute("Default", new { action = "contactsucess", controller = "contact" });
}
// Return Form if not valid
return View(contact);
}
// GET: /Contact/ContactSucess
public ActionResult ContactSucess()
{
ViewBag.IsContactPage = true;
return View();
}
}
使序列化、日志记录和 STMP 逻辑与返回成功/感谢页面的控制器异步的最佳方法是什么。基本上我的目标是防止这些调用阻塞整体进度,以便表单完成得更快。
【问题讨论】:
-
使电子邮件发送代码异步
-
这部分慢?着眼于提高效率。我猜 Smtp.SendMail 是花费时间的地方,如果是这样,@EhsanSajjad 是对的。
-
电子邮件是最慢的部分。我希望围绕进行调用的逻辑实现一个包装器。
-
使用 smtpClient.SendMailAsync 方法不会缩短时间。
标签: asp.net-mvc asynchronous asp.net-mvc-5 async-await