【ASP.NET WebForms】Response.End() 在 async/非同步流程下造成 ThreadAbortException

還有好長一段時間需要維護ASP.NET WebForms
有遇到需要注意的地方就記錄一下,避免同一個坑洞跌進兩次

程式邏輯裡同時包含同步與非同步操作,例如:

var data = GetData();                  // 同步
_ = SendNotificationAsync(data);       // 非同步(fire-and-forget)
Response.Write(JsonConvert.SerializeObject(data));
Response.End();

Response.End(); 這一行做的事情實際上是:
throw new ThreadAbortException();
它會立刻中斷目前這個 request 所使用的執行緒

非同步可能還沒跑完,continuation 也可能因為 ThreadAbortException 而無法如預期執行

正確的作法是改用

HttpContext.Current.ApplicationInstance.CompleteRequest();

async continuation 不會因為 ThreadAbortException 而被強制中斷

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *