4

メールを非同期で送信するためのユーティリティ コードを作成しています。

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)「逆効果」にならずにタスクをスレッド化するさらに良い方法はありますか?

4

1 に答える 1

2

何ページからメールを送信する必要がありますか?

また、非同期を送信しようとしたときにどのようなエラーが発生しましたか? 質問を編集して、例外全体を含めてください。

メールを送信する単一の (非同期) ページを作成することを検討してください。Server.Transfer を使用してそのページを呼び出し、完了したら目的のページにリダイレクトすることができます。

最後に、同期的にメールを送信するとパフォーマンスが低下するほど多くのメールを送信している場合は、実際のメールを送信する Windows サービスを作成する必要があります。ASP.NET ページは、(MSMQ または WCF を介して) このサービスへの要求をキューに入れ、サービスに電子メールを送信させます。

于 2009-07-02T16:07:23.377 に答える