2011-01-15 2 views
4

私は、非同期ポストバックを取り消すのに少し問題があります。私は、ユーザーがポストバックを取り消すことができるように、キャンセルボタンを含む更新進行状況の更新パネルを持っています。ユーザーがボタンをクリックしてレポートを生成すると、更新の進捗状況が表示されます。スプレッドシートを作成するのに数千回もループしなければならないため、レポートには少し時間がかかることがあります。ユーザーが何らかの理由でレポートの実行をキャンセルすることにした場合、キャンセルボタンをクリックするとjavascriptのabortPostBack()が呼び出され、更新の進行が停止し、ページが再び表示されます。しかし、サーバーはまだループを処理しているので、別のページに移動するような操作はできません。ユーザーがキャンセルボタンをクリックしたときに、サーバー処理のループをどのように停止するのですか?どんな助けにも感謝!アシンクスのポストバック(サーバープロセスが長い場合)

+0

私の経験から、あなたはできません。サーバーは常に要求を処理し続けます。 –

答えて

1

非同期ポストバックが完了するまで、クライアント側で単純なHTTPリンクにアクセスできないと言っていますか?もしそうなら、あなたはサーバー側のプロセスを最適化するか、より小さなサーバー側の要求タイムアウトを設定する必要があるので、それは難解です。どちらの場合でも、ユーザインタラクションを再設計して、サーバ側のExcel生成プロセスを非同期型にすることで、Excel生成が完了するまで待つ必要がなくなります。クライアントサイドでこれを気にして、定期的にサーバーに問い合わせて、ファイルが準備完了状態になっているかどうかを確認するJavaScriptタイマーを設定し、そうであればそれをユーザーに示し、ダウンロードファイルのリンクオプションなどを渡します。

そうでなければ、別のAJAXリクエストを呼び出して戻ってくることを待っていれば、それは長時間実行されているプロセスを "キャンセル"する新しいHTTPリクエストを実行するだけです。しかし、サーバーが長時間実行されているHTTPリクエストを処理しているので、動作しないようです。だから私は最初の段落のオプションを調べることにしました。

クライアント側で非同期HTTP要求が実行された場合、キャンセルが要求されたことを示すセッション状態値を設定できます。個人的に私はこのようにアプローチしません。しかし、そうしてしまったら、長時間実行しているサーバー側のプロセスが定期的にセッション値の有無を調べることができます。セイ:

if (Session["cancel-me"] != null) 
{ 
    Session["cancel-me"] = null; 
    abortThisLongProcess(); 
} 
+2

'Session'オブジェクトに書き込むことは、ASP.Netのセッション同時実行性を打つことを意味します。つまり、ページがセッションにアクセスすると、そのページが終了するまでロックされます。 – Keith

0

うん、あなたはできるだけ早くあなたが長いプロセスが完了するまで、ハングサーバーにページをポストバックする必要が何かをクリックすると、ブラウザの[戻る]ボタンを使用してページから移動しても。取り消す方法がないように見えるので、Excelの世代を見直す必要があります。

0

実行中のリクエストをキャンセルする方法が見つかりませんでしたが、新しいリクエストを開始できないという本当の理由はありません。

デフォルトでは、ASP.Netは、セッションオブジェクトに排他ロックを適用しようとします(同じセッションIDを渡す他のページ要求がCookieまたはURL)は、最初のページがセッションを解放するのを待たなければなりません。

クライアントが要求をキャンセルしても問題はありません。元のページの実行が終了するまで、サーバーはセッションをロックし続けます。

解決策は、do away with the ASP session entirelyです。その後、ユーザーが別のページを要求すると、サーバーは別のスレッドで古い要求を処理していてもすぐに開始します。