20

次のシナリオで、 ASP.NET 2.0 でBackGroundWorker スレッドを使用して、ブラウザ側のユーザーを長時間待たせることはできますか?

シナリオ

  1. ブラウザは、SendEmails.aspx などのページを要求します。
  2. SendEmails.aspx ページは BackgroundWorker スレッドを作成し、電子メールを作成して送信するのに十分なコンテキストをスレッドに提供します。
  3. ブラウザは ComposeAndSendEmails.aspx から、電子メールが送信されていることを示す応答を受け取ります。
  4. その間、バックグラウンド スレッドは電子メールの作成と送信のプロセスに従事しており、完了するまでにかなりの時間がかかる可能性があります。

私の主な関心事は、BackgroundWorker スレッドを実行し続け、ASP.NET workerprocess スレッドプール スレッドがなくなっている間、たとえば 50 通の電子メールを送信しようとすることです。

4

7 に答える 7

13

AJAX ライブラリを使用したくない場合、または電子メールの処理に非常に時間がかかり、標準の AJAX 要求がタイムアウトになる場合は、.net 1.1 時代の「古いハック」であった AsynchronousPostBack メソッドを使用できます。

基本的に、ユーザーが中間ページに移動している間に、送信ボタンで電子メールの処理を非同期状態で開始します。これの利点は、標準のタイムアウトに達することを心配することなく、中間ページを必要なだけ更新できることです。

バックグラウンド プロセスが完了すると、データベース/アプリケーション変数などに小さな「完了」フラグが設定されます。中間ページがそれ自体を更新すると、このフラグが検出され、ユーザーは自動的に「完了」ページにリダイレクトされます。

繰り返しますが、AJAX はこのすべてを意味のないものにしますが、何らかの理由で Web 経由で実行する必要がある非常に集中的またはタイムリーなプロセスがある場合は、このソリューションが役立ちます。ここで素敵なチュートリアルを見つけましたが、他にもたくさんあります。

サード パーティ製アプリケーションとやり取りする「Web チェックイン」タイプのアプリケーションで作業していたときに、このようなプロセスを使用する必要があり、それらのインポート API が非常に遅かったのです。

編集:ガー!Guzlar と神のようなタイピング能力 8^D を呪ってください。

于 2008-09-11T23:00:23.770 に答える
7

ASP.NETページからスレッド化を行うべきではありません。長時間実行されているスレッドは、ワーカープロセスがリサイクルされるときに強制終了される危険があります。これがいつ起こるかを予測することはできません。長時間実行されるプロセスは、Windowsサービスで処理する必要があります。たとえば、MSMQにメッセージをドロップすることで、これらのプロセスを開始できます。

于 2008-09-11T23:20:28.417 に答える
6
ThreadPool.QueueUserWorkItem(delegateThatSendsEmails)

または System.Net.Mail.SmtpServer では SendAsync メソッドを使用します。

メール送信コードを別のスレッドに配置すると、すぐにユーザーが返され、どれだけ時間がかかっても処理されるためです。

于 2008-09-11T22:52:39.047 に答える
2

このシナリオで使用する必要があるのは、ASP.NET2.0で追加された機能である非同期ページです。

非同期ページは、I/Oバウンド要求によって引き起こされる問題に対する適切な解決策を提供します。ページ処理はスレッドプールスレッドで開始されますが、ASP.NETからのシグナルに応答して非同期I / O操作が開始されると、そのスレッドはスレッドプールに返されます。操作が完了すると、ASP.NETはスレッドプールから別のスレッドを取得し、要求の処理を終了します。スレッドプールスレッドがより効率的に使用されるため、スケーラビリティが向上します。I / Oが完了するのを待たずにスタックしていたスレッドを、他のリクエストの処理に使用できるようになりました。直接の受益者は、長時間のI / O操作を実行しないため、パイプラインにすばやく出入りできるリクエストです。

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

于 2008-09-11T23:28:37.197 に答える
2

ASP ページでマルチスレッドを使用する場合は、次のような単純なスレッド モデルを使用できます。

{
    System.Threading.Thread _thread = new Thread(new ThreadStart(Activity_DoWork));
    _thred.Start();
}
Activity_DoWork()
{
    /*Do some things...
}

この方法は、ASP ページで正しく動作します。BackgroundWorker が終了する間、BackgroundWorker を含む ASP ページは開始されません。

于 2009-01-10T14:24:02.137 に答える
2

可能です。ページから非同期で新しいスレッドを開始すると、ページ要求が続行され、ページがユーザーに返されます。非同期スレッドはサーバー上で引き続き実行されますが、セッションにはアクセスできなくなります。

タスクの進行状況を表示する必要がある場合は、いくつかの Ajax 手法を検討してください。

于 2008-09-11T22:55:56.573 に答える
2

5 年後、問題は同じです... アプリケーションからファイア アンド フォーゲット操作を実行し、ASP.NET アプリケーションのバックグラウンド ジョブ処理に関連する問題をすべて忘れたい場合は、http://hangfire.ioを使用できます。

  • 永続的なストレージを使用してバックグラウンド ジョブに関する情報を保持するため、リサイクル プロセスでジョブが失われることはありません。
  • 一時的な例外 (SMTP サーバー接続エラー) が原因で中止または失敗したバックグラウンド ジョブを自動的に再試行します。
  • 統合された Web インターフェイスを介してバックグラウンド ジョブを簡単にデバッグできます。
  • HangFire のインストール/構成/使用は非常に簡単です。

HangFire with Postalを使用するためのチュートリアルSending Mail in Background with ASP.NET MVCもあります。

于 2014-06-10T17:33:28.017 に答える