9

-Page_Loadを使用するときに(または他のASP.NETイベント)からリダイレクトする方法はありますか?もちろんスローしますが、それをキャッチしても、エラーページが表示されます。私が呼んだ場合、それはクラッシュしませんが、ページの実行を停止する必要があるので(ページのレンダリングなど)、それは解決策ではありません。そして、私が気付いたように、これら2つの方法は異なる動作をします。asyncawaitRedirectThreadAbortExceptiontrycatchResponse("url", false)

これはThreadAbortExceptionで終わります(タスクは同期的に終了すると思います):

protected async void Page_Load()
{
    await Task.Run(() => { });
    Response.Redirect("http://www.google.com/");
}

これはResponse.Redirectの後も続きます:

protected async void Page_Load()
{
    await Task.Delay(1000);
    Response.Redirect("http://www.google.com/");
}

応答を待つ必要がありますが、実験していたため、awaitキーワードを削除しても(つまり、タスクがバックグラウンドで実行され、メソッドが続行されます)、同じ結果になります。役立つのはasyncキーワードを削除することだけです-私はasync有効awaitにするだけでそれ以上は何もないと思いましたか?!

4

2 に答える 2

2

OK、私はそれに対処する方法の答えを見つけました。

基本のPageクラスにRedirectメソッドラッパーを作成しました。

protected void Redirect(string url)
{
    this.isRedirecting = true;

    Response.Redirect(url, false);

    if (Context.ApplicationInstance != null)
        Context.ApplicationInstance.CompleteRequest();
}

そしてオーバーライドRenderしてRaisePostBackEvent

protected override void Render(HtmlTextWriter writer)
{
    if (this.isRedirecting)
        return;
}

protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
{
    if (!this.isRedirecting)
        base.RaisePostBackEvent(sourceControl, eventArgument);
}

それがトリックです。ASP.NET 4.5は、待機中PreRenderCompleteのすべてのタスクが完了するまで、イベントを発生させません(=ライフサイクルを継続しません)。

于 2012-11-02T15:46:00.267 に答える
1

免責事項:私はasync/を使用していませんawaitが、以下はドキュメントを読んだことに基づいています。

私が理解しているようawaitに、コードにが含まれていると、非同期で提供されたタスクが呼び出され、メソッドの残りの部分は事実上コールバックメソッドに変換されます。したがって、この場合、Page_Loadは非同期であるため、それを実行して待機するようになると、非同期タスクが完了するのを待っている間、呼び出し元に制御を返します。

イベントの場合、Page_Loadこれは完了したように見えると思います。おそらく、ページのライフサイクルは次のステップに進みます。

違いの理由は、最初の例ではライフサイクルを継続しますが、コールバックはほぼ即時であるためResponse.Redirect、ページの残りの部分が何かを実行する前に、ほぼ即時に実行されるためです。

2番目の場合、1000の遅延があり、その間、ページは他のものを実行し続け、その遅延が過ぎた場合にのみrespone.redirectが起動します。これは、(エラーからの)応答がすでに発生した後の可能性があります。

つまり、本質的にasyncは有効にawaitなりawaitますが、予想よりも少し多いように聞こえます。

于 2012-10-30T11:39:03.660 に答える