บทความ KB นี้บอกว่า ASP.NET Response.End()ยกเลิกการใช้เธรด
Reflector แสดงให้เห็นว่ามันเป็นเช่นนี้:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
มันช่างโหดร้ายเหลือเกินสำหรับฉัน ดังที่บทความ KB กล่าวว่าโค้ดใด ๆ ในแอปพลิเคชันต่อไปนี้Response.End()จะไม่ถูกประมวลผลและที่ละเมิดหลักการของความประหลาดใจอย่างน้อยที่สุด มันเกือบจะเหมือนApplication.Exit()ในแอพ WinForms ข้อยกเว้นการยกเลิกเธรดที่เกิดจากResponse.End()ไม่สามารถจับได้ดังนั้นการล้อมรอบโค้ดในtry... finallyจะไม่เป็นไปตาม
Response.End()มันทำให้ฉันสงสัยว่าฉันควรหลีกเลี่ยง
ใครสามารถแนะนำฉันควรใช้Response.End()เมื่อใดResponse.Close()และเมื่อไหร่HttpContext.Current.ApplicationInstance.CompleteRequest()?
จากคำตอบที่ฉันได้รับคำตอบของฉันคือใช่Response.Endเป็นอันตรายแต่มีประโยชน์ในบางกรณี
- ใช้
Response.End()เป็นการโยนที่ไม่สามารถจับตาดูได้เพื่อยุติHttpResponseเงื่อนไขพิเศษทันที จะมีประโยชน์ในระหว่างการดีบักด้วย หลีกเลี่ยงResponse.End()การตอบประจำสมบูรณ์ - ใช้
Response.Close()เพื่อปิดการเชื่อมต่อกับไคลเอนต์ทันที สำหรับการโพสต์บล็อก MSDNนี้วิธีนี้ไม่ได้มีไว้สำหรับการประมวลผลคำขอ HTTP ปกติ ไม่น่าเป็นไปได้สูงที่คุณจะมีเหตุผลที่ดีที่จะเรียกวิธีนี้ - ใช้
CompleteRequest()เพื่อยุติการคำขอปกติCompleteRequestทำให้ไปป์ไลน์ ASP.NET เพื่อข้ามไปข้างหน้ากับEndRequestเหตุการณ์หลังจากHttpApplicationเหตุการณ์ปัจจุบันเสร็จสมบูรณ์ ดังนั้นถ้าคุณโทรCompleteRequestแล้วเขียนอะไรมากกว่านี้เพื่อตอบสนองการเขียนจะถูกส่งไปยังลูกค้า
แก้ไข - 13 เมษายน 2554
ความชัดเจนเพิ่มเติมมีอยู่ที่นี่:
- โพสต์ที่เป็นประโยชน์ในบล็อก MSDN
- การวิเคราะห์ที่เป็นประโยชน์โดย Jon Reid
Response.RedirectและServer.Transferเรียกร้องทั้งสองResponse.Endและควรหลีกเลี่ยง
Response.EndThreadAbortExceptionก็เข้าใจได้ดี