Asp.net
ASP.NET 4.5 非同步等待和 Response.Redirect
使用-時有什麼方法可以從
Page_Load(或任何其他 ASP.NET 事件)重定向?當然會拋出,但即使我抓住它-它最終會出現錯誤頁面。如果我呼叫它不會崩潰,但我需要停止執行頁面(渲染頁面等),所以這不是解決方案。正如我注意到這兩種方法的作用不同:async``await``Redirect``ThreadAbortException``try``catch``Response("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,僅此而已?!
好的,我找到瞭如何處理的答案。
我在我的基 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事件(= 在生命週期中不會繼續)。