特定の MVC コントローラー メソッドが呼び出されると、メールが送信されます。コードは以下の通りです。ブラウザ内で AJAX の応答時間をベンチマークすると、メールをまったく送信しない場合と比較して、client.SendAsync(mail, null)
と実装の両方がほぼ同じ時間、つまり 1.8 秒かかることがわかります。client.Send(mail)
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);
}
質問:
- 2 つの方法で同じ時間がかかるのはなぜですか? Async はすぐに戻る必要がありますが、Sync は処理時間全体にわたってブロックする必要があります。私が理解しているように、非同期は別のスレッドを消費し、そのスレッドは作業中にブロックされます。ただし、少なくとも 1 番目のスレッドのユーザーはパフォーマンスが向上するはずです。
- 非同期モードのような
using
クラスを適切に破棄するにはどうすればよいですか?SmtpClient
MailMessage