这篇知识库文章说 ASP.NETResponse.End()中止了一个线程。
Response.End()
反射器显示它看起来像这样:
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(); } } }
这对我来说似乎很苛刻。正如知识库文章所说,应用程序中的任何代码Response.End()都不会被执行,这违反了最小惊讶原则。这几乎就像Application.Exit()在 WinForms 应用程序中一样。导致的线程中止异常Response.End()是不可捕获的,因此将代码包围在try…finally中不会满足。
Application.Exit()
try
finally
这让我想知道我是否应该总是避免Response.End()。
任何人都可以建议,我应该何时使用Response.End(),何时Response.Close()何地HttpContext.Current.ApplicationInstance.CompleteRequest()?
Response.Close()
HttpContext.Current.ApplicationInstance.CompleteRequest()
参考:Rick Strahl 的博客条目。
根据我收到的意见,我的回答是, 是的,Response.End是有害的,但它在某些有限的情况下很有用。
Response.End
HttpResponse
CompleteRequest()
CompleteRequest
EndRequest``HttpApplication``CompleteRequest
编辑 - 2011 年 4 月 13 日
此处提供了进一步的说明:
ThreadAbortException如果您在应用程序上使用了异常记录器,它会被这些良性Response.End()调用中的 s 淡化。我认为这是微软说“Knock it off!”的方式。
ThreadAbortException
我只会Response.End()在有一些特殊情况并且不可能采取其他行动的情况下使用。也许那时,记录此异常实际上可能表示警告。