asp.netで2時間などの長いプロセスを実行し、進行状況についてクライアントに情報を返す最も成功した方法は何ですか.
Windows サービス、httphandler、およびリモート処理を作成すると成功すると聞いたことがあります。
asp.netで2時間などの長いプロセスを実行し、進行状況についてクライアントに情報を返す最も成功した方法は何ですか.
Windows サービス、httphandler、およびリモート処理を作成すると成功すると聞いたことがあります。
私がこれを処理した方法は2つあります。まず、単純にプロセスを実行してクライアントをタイムアウトさせることができます。これには 2 つの欠点があります。UI が同期していないことと、HTML 以外の目的で IIS スレッドを結び付けていることです (これは、以前は十分に迅速に返されていたが、タイムアウト制限を超えて成長したプロセスに対して行いました)。
これを処理するより良い方法は、データベース テーブルを介して渡された要求を処理する "サービス" アプリケーションを作成することです (要求の詳細をそこに置きます)。次に、ユーザーにタスクの進行状況を示す「ウィンドウ」を提供するウィンドウを作成できます (たとえば、処理されたレコードの数や送信された電子メールの数など)。このステータス ウィンドウには、ユーザーが更新できるリンクを表示するか、タイマーで Ajax コールバックを使用して更新を自動化できます。
ただの提案...
すでにasp.netで利用しようとしているロジックがある場合... asp.netページでWebサービスを呼び出す外部アプリ(Windowsサービス、コンソールアプリなど)を作成できます。
たとえば、必要なコードが asp.net であり、このコードを使用して約 3000 のクライアントを更新する必要があるという同様の問題がありました。タイムアウトし始めたので、Web サービスを介してコードを公開しました。次に、asp.net を介して 3000 のクライアント全体を一度に実行しようとする代わりに、クライアントごとに 1 回 Web サービスを実行する夜間の SQL サーバー ジョブによって実行されるコンソール アプリを使用しました。このように、時間のかかるすべての処理は、タイムアウトの問題のないコンソール アプリによって処理されましたが、asp.net で既に記述したコードを再作成する必要はありませんでした。最終的に、既存のアーキテクチャの設計を少し変更することで、この問題を簡単に回避することができました。
それは、対処しなければならない環境と制約に大きく依存します...これが役立つことを願っています。
これは直接適用できませんが、Windows サービスやあらゆる種類の cron ジョブを使用する必要なく、ASP.NET 内で「スケジュールされたタスク」に似たプロセスを実行できるようにするコードを作成しました。
私は、スケジュールされたタスクよりも WCF サービスを非常に好みます。あなたは(私の頭の上から)addrをWCFサービスに一種の「コールバック」として渡すかもしれません。サービスは動作中に進行状況レポートで呼び出すことができます。
私はスケジュールされたタスクを敬遠します...あまりにも粗いです。