0

タスクを実行するコントローラーのアクションがあり、最後にユーザーに確認メールを送信します。電子メールの部分はそれほど重要ではないので、電子メールの送信で例外がスローされた場合にアクションを中断させたくありません。また、HTTP 応答が電子メールを待機するのを待ちたくありません。いずれかで送信されます。私はこれを火事にして忘れるものにしたい.

一言で言えば、これは私がそれにアプローチした方法です:

public async Task<ActionResult> MyAction(){
    // Do stuff
    await DoStuff();        

    Thread sendEmailThread = new Thread(SendEmail);
    sendEmailThread.Start();

    return result;
}

private async void SendEmail(){
    await smtpClient.SendMessageAsync();
}


このアプローチは適切ですか?

4

3 に答える 3

1

新しい電子メールが到着するたびに新しいスレッドを開始するのは得策ではありません。

別のアプローチ (特に電子メールの場合)

通常、アプリケーションの背後でバックグラウンド スケジューリング システムを実行します。たとえば、Quartz.NET

次に、電子メールをキュー (またはデータベース) にキューイングし、バックグラウンド スレッドがキュー (またはデータベース) からピックアップして、プロセスを実行します。

これにより、SMTP にエラーが発生した場合にメールを再送信できます。

于 2014-10-23T00:06:37.013 に答える
0

async操作が開始されるとすぐにメソッドが戻り、操作が完了する前にスレッドが終了するため、電子メールを送信するための新しいスレッドを開始する必要はありません。

非同期操作はスレッドを使用しないため、Taskそのメソッドとそれからa を返すのが最善ですawaitvoidメソッドを返す非同期は悪い考えであり、それらから例外が伝播されず、操作がいつ完了したかを知ることができません。詳細については、非同期プログラミングのベスト プラクティスを参照してください。

もしあなたが本当にファイア アンド フォーゲット タスクを実行したいのであれば、このテーマに関するStephen Cleary のブログを参照してください。

于 2014-10-23T01:00:57.383 に答える