ASP.Net アプリケーションで長時間実行されるプロセスを処理する最善の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/73039

  •  09-06-2019
  •  | 
  •  

質問

私の Web アプリケーションには、Web 全体からデータをクエリし、フィルタリングして、データベースに保存するプロセスがあります。ご想像のとおり、このプロセスには時間がかかります。私の現在の解決策は、ページのタイムアウトを増やし、読み込み中にユーザーに AJAX プログレスバーを表示することです。これには 2 つの理由から問題があります。1) 依然として時間がかかり、ユーザーは待たなければなりません。2) 依然としてタイムアウトになることがあります。

私はプロセスのスレッド化に手を出し、それをWebサービスに非同期で投稿する必要があることを読みました(「ファイアアンドフォーゲット」)。

私が読んだいくつかの参考文献:
- MSDN
- ファイア・アンド・フォーゲット

そこで私の質問は、最良の方法は何ですか?

アップデート:ユーザーがデータを入力した後、プロセスがバックグラウンドで実行されるにつれて段階的に更新される結果ページにユーザーをリダイレクトしたいと考えています。

役に立ちましたか?

解決

過度の建築天文学を避けるために、私はしばしば 非表示の iframe を使用して長時間実行プロセスを呼び出し、進行状況情報をストリームバックします。. 。次のようなものと組み合わせて jsProgressBarHandler, を使用すると、一般的な進行状況アニメーションでは処理できない、長いタスク向けの優れたアウトオブバンド進行状況表示を非常に簡単に作成できます。

特定の状況では、ページ タイムアウトを回避するために、タスクごとに 1 つの LongRunningProcess.aspx 呼び出しを使用することができます。

たとえば、LongRunningProcess.aspx?taskID=1 を呼び出してタスクを開始し、そのタスクの終了時に

document.location = "LongRunningProcess.aspx?taskID=2".  

吐き気がする。

他のヒント

私たちも同様の問題を抱えていましたが、非同期 Web サービス呼び出しを介して作業を開始することで解決しました (つまり、ユーザーは作業が完了するまで待つ必要がありませんでした)。次に、Web サービスは SQL ジョブを開始し、作業を実行し、作業のステータスでテーブルを定期的に更新しました。ユーザーがテーブルをクエリできる UI を提供しました。

私は前の仕事でまさにこの問題に遭遇しました。私が見つけた最良の方法は、非同期プロセスを起動し、それが完了したときにユーザーに通知することでした (電子メールなど)。それほど長く待たせると、タイムアウトが発生し、生産性が無駄になるため、問題が発生します。プログレスバーが表示されるまで待たせると、ブラウザを閉じればプロセスをキャンセルできるという誤った安心感を与える可能性がありますが、システムの設定方法によってはそうでない場合もあります。

  1. リモート データをどのようにクエリしていますか?
  2. どのくらいの頻度で変更されますか?
  3. 結果は一定期間キャッシュできるものですか?
  4. ここで実際に話している期間はどれくらいですか?

「最善の方法」は、これらの質問に対する答えに何らかの形で依存する可能性があります...

スレッドが Web サイトごとに 1 回だけ実行できるか、ユーザー セッションごとに 1 回だけ実行できるかに応じて、別のスレッドを作成し、セッションまたはアプリケーションの状態にスレッドへの参照を保存できます。
その後、スレッドの進行状況を監視できるページにユーザーをリダイレクトできます。ページが自動的に更新されるように設定したり、更新ボタンをユーザーに表示したりできます。
スレッドが完了したら、ユーザーに電子メールを送信できます。

これに対する私の解決策は、これらを実行してデータベースにキャッシュする帯域外サービスです。

ユーザーが初めて何かを要求したとき、少し待ってから表示されますが、更新するとすぐに表示され、データベースに組み込まれているため、次の時間ごとの更新の一部になります。最後のリクエストから 24 時間。

ジョブを関連パラメータとともにジョブ キュー テーブルに追加します。次に、これらのジョブを取得して処理し、結果を適切な場所に保存し、結果へのリンクを電子メールで要求者に送信する Windows サービスを作成します。ユーザーがジョブのステータスを確認できるように、何らかの UI を提供するのも良い方法です。

この方法は、必要に応じて複数のサーバーを追加してジョブを処理できるため、特にアプリケーションが大きく拡張する必要がある場合に、個別のスレッドを起動したりタイムアウトを増やしたりするよりもはるかに優れています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top