メールを非同期で送信するためのユーティリティ コードを作成しています。
var mailClient = new SmtpClient(smtpHost);
mailClient.SendCompleted += new SendCompletedEventHandler(mailClient_SendCompleted);
using (var mailMessage = new MailMessage())
{
if (!((System.Web.UI.Page)HttpContext.Current.CurrentHandler).IsAsync)
{
// set to Async????
}
mailClient.SendAsync(mailMessage, new { EmailID });
}
しかし、ページのディレクティブに Async="true" がないため、エラーが発生します。
表示される標準エラーは次のとおりです。
"Asynchronous operations are not allowed in this context. Page starting an asynchronous operation has to have the Async attribute set to true and an asynchronous operation can only be started on a page prior to PreRenderComplete event."
私はこれを読みました:(最後の段落)
http://msdn.microsoft.com/en-us/magazine/cc163725.aspx
非同期ページを作成する際の最後の注意点は、ASP.NET が使用する同じスレッド プールから借用する非同期操作を起動しないことです。たとえば、ページの非同期ポイントで ThreadPool.QueueUserWorkItem を呼び出すと逆効果です。そのメソッドはスレッド プールから取得するため、要求を処理するためのスレッドがゼロになるという結果になります。対照的に、フレームワークに組み込まれている非同期メソッド (HttpWebRequest.BeginGetResponse や SqlCommand.BeginExecuteReader など) の呼び出しは、一般に安全であると見なされます。これらのメソッドは完了ポートを使用して非同期動作を実装する傾向があるためです。
質問:
1) C# コードでページを非同期に更新するにはどうすればよいですか?
2) すべてのページを強制的に Async=true にすることのマイナス面は何ですか?
3)「逆効果」にならずにタスクをスレッド化するさらに良い方法はありますか?