0

ユーザーが別の Web ページにリダイレクトする必要がある OnTimedEvent を除いて、ユーザーがボタンを押してから 4 秒後に起動するようにタイマーを設定しています。これが私がこれまでに持っているものです:

onClickボタンのイベント:

System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 4000;
aTimer.Enabled = true;

次に、OnTimed Event()私は持っています:

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Response.Redirect("~/Account/DeleteAccount.aspx");            
}

私も試してみました

HttpContext.Current.Response.Redirect("~/Account/DeleteAccount.aspx");

運がOnTimedEvent悪い。

4

3 に答える 3

2

ページを発行したら、リダイレクトを送信するには遅すぎます。応答はすでに送信されているため、所有している応答オブジェクトは無効になります。

代わりに、次のようなクライアント側のスクリプトコードで処理する必要があります。

window.setTimeout(function() { window.location.href = "~/Account/DeleteAccount.aspx"; }, 4000);

または、応答に更新ヘッダーを設定して、その時点で別のページをロードする必要があることをクライアント側に通知します。

また、そのようなページ内からタイマーをインスタンス化することはおそらく悪い考えです-無効な応答オブジェクトを保持しているという事実に加えて、訪問者がページを閉じてもタイマーはハングし、それはかなり高価なオブジェクトですシステムリソースの。

ソース:asp.netタイマーとresponse.redirect

于 2012-08-09T17:18:19.380 に答える
0

標準の非同期モデルは、単一の Web 応答のコンテキストではあまりうまく機能しません。タイマーの設定が終了すると、それを行ったメソッドの実行が継続されます。つまり、応答の構築が終了し、それが送信されます (おそらく 4 秒ですべてを実行する時間があります)。このため、タイマーが発火するまでに、応答はすでに送信されて終了しています。HTTP は、リクエストが終了するとそれ以上送信できなくなり、無視されるように設計されています。

いくつかの選択肢があります。1 つは、応答が 4 秒間送信されないようにすることです。(これは、タイマーを使用するのではなく、Thread.Sleepブロックのようなものを使用して 4 秒待機することを意味します。) もう 1 つは、応答を送信できるようにすることですが、タイマーを設定して 4 秒でリダイレクトを実行する JavaScript またはその他のクライアント側コードを用意することです。 . 2 番目のオプションは、待機中にレンダリングするページがある場合に必要になります。最初のオプションは、サーバーが何かを実行しているときにブラウザが回転するのをユーザーに見てもらいたい場合に最適です。

目標が 4 秒待つだけではなく、実行時間の長いタスクを実行することであり、このタイマーがタスクの終了を待つ試みである場合は、その設計を変更する必要があります。Web 環境では、現在のスレッドで実行時間の長いタスク (実行時間が数分/時間ではなく、1 秒または 2 秒であると想定) を直接実行する方がよいでしょう。これは、スレッドがそのビジネスを続行するのをブロックしたいためです。仕事をするために新しいスレッドをスピンアップする場合、応答に影響を与えることができることに頼ることはできません (したがって、応答にまったく影響しない場合は、スレッドを新しく作成しても問題ありません)。あなたの要求が本当なら長い、または完了する前にクライアントに何かを表示したい場合は、長時間実行されているタスクが終了する前に AJAX を使用して応答を送信し、更新できるように新しい要求をサーバーに送信し続ける必要があります。長時間実行されるタスクが結果を生成した後のページ。 これは、この手法を示すクールな例です

于 2012-08-09T17:05:29.480 に答える
0

私が理解できる限り (そして、この部分では完全に間違っているかもしれません)、このコードは意味がありません。これHttpContext.Currentは ASP.NET に関連していると推測されます。コードが c# であることから、サーバー コードであるとも推測されます。

通常の状況では (タイマーを使用せずに)、サーバーでリダイレクトを行う場合。これはおおよそ次のようになります。

  1. クライアントがサーバーにリクエストを送信します
  2. サーバーはページのライフサイクルを実行します
  3. このサイクルのある時点で、aResponse.Redirectが呼び出されます。
  4. サーバーは、http ヘッダーと、メソッドに指定された URL に移動する必要があるという情報をクライアントに返しますResponse.Redirect
  5. 接続が閉じられています。

ここで、ポイント 4 の後、ブラウザーに他の場所に移動するように指示する方法はありません (サーバー送信イベント、ロング プーリング、または一般的な COMET を使用しない場合)。

ここで問題が発生しResponse.Redirectます。ポイント 3 で呼び出す代わりに、タイマーを開始します。これより何が起こるか:

  1. タイマーが開始されます
  2. サーバーはページのライフサイクルを終了し、コンテンツをクライアントに返します。
  3. 接続が閉じられています。

そしてしばらくすると

  1. タイマーが作動します。
  2. クライアントに「リダイレクト」を送信しようとしましたが、クライアントはすでになくなっています。

ボタンがクリックされたときに他のサーバー側コードを実行する必要がない限り、これはおそらく javascript onclick を使用して最も簡単に実現できます。このようなもの:window.setTimeout(function(){window.location = 'newLocation.aspx....';}, 4000/*4 sec*/);

于 2012-08-09T17:08:13.667 に答える