1

特定の 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);
}

質問:

  1. 2 つの方法で同じ時間がかかるのはなぜですか? Async はすぐに戻る必要がありますが、Sync は処理時間全体にわたってブロックする必要があります。私が理解しているように、非同期は別のスレッドを消費し、そのスレッドは作業中にブロックされます。ただし、少なくとも 1 番目のスレッドのユーザーはパフォーマンスが向上するはずです。
  2. 非同期モードのようなusingクラスを適切に破棄するにはどうすればよいですか?SmtpClientMailMessage
4

1 に答える 1

0

非同期 smtpclient での msdn の例については、こちらを参照してください。
この例では、dispose as を使用していません (これはマイナーな推測です)。使用は、非同期操作が完了するのを待ちます。
テストの目的で、using ステートメントを削除してみてください。
もちろん、smtpclient オブジェクトを適切に破棄していません。破棄を処理する 1 つの方法は、電子メールを古い skool の方法で処理する新しいスレッドを作成することです。SendAssync のクリーンさはありませんが、少なくともユーザーが即座にフィードバックを受け取り、smtpclient が適切に破棄されることは確実です。

編集: さらに良い解決策は、イベント sendcompleted を使用し、そこで smtpclient を破棄することです。例については、ここ
を 参照してください

于 2012-10-31T09:50:16.150 に答える