還有好長一段時間需要維護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 而被強制中斷