1

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

私はプロセスのスレッド化に手を出し、ウェブサービスに非同期投稿する必要があることを読みました(「発射して忘れる」)。

私が読んだ参考文献:
- MSDN
- Fire and Forget

だから私の質問は - 最良の方法は何ですか?

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

4

7 に答える 7

7

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

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

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

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

うんざり。

于 2008-09-16T15:15:30.040 に答える
3

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

于 2008-09-16T14:50:58.867 に答える
1

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

于 2008-09-16T14:41:59.637 に答える
0

ジョブを関連パラメータとともにジョブ キュー テーブルに追加します。次に、これらのジョブを取得して処理し、結果を適切な場所に保存し、結果へのリンクをリクエスタに電子メールで送信する Windows サービスを記述します。ユーザーが自分のジョブのステータスを確認できるように、ある種の UI を提供するのもいい感じです。

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

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

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

于 2008-09-16T14:48:46.687 に答える
0

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

于 2008-09-16T14:51:07.617 に答える
0

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

人が初めて何かを要求したとき、彼らは少し待ってから表示されますが、更新するとすぐに表示され、データベースが int であるため、次の 1 時間ごとの更新の一部になります。最後のリクエストから 24 時間。

于 2008-09-16T14:51:38.083 に答える