使用httpResponse.End来消除ThreadAbortException异常

3

有没有办法替换httpResponse.End(),避免抛出ThreadAbortException造成性能问题?有人建议使用'HttpContext.Current.ApplicationInstance.CompleteRequest()',但这不像httpResponse.End()那样做所有的事情,例如将缓冲数据发送到客户端,这对于我来说是个问题。


你有没有任何迹象表明异常确实会影响性能?它每秒被抛出多少次,你的服务器有多少CPU负载? - Jon Skeet
我不确定,但是我公司的QA团队似乎相信这一点。 - Art F
你的QA团队应该提供证据。 (异常并不便宜,但是除非您在单个机器上处理数万个请求每秒,否则我希望它们会在噪音中丢失。) - Jon Skeet
2个回答

3
首先,我怀疑这确实会导致严重的问题。然而,无论如何,这通常都不是一个好主意... 这实际上是异常的滥用。(在我看来,是这样的。)
文档中得知:

该方法仅用于与ASP兼容 - 也就是说,与ASP.NET之前的基于COM的Web编程技术兼容。如果您想跳到EndRequest事件并向客户端发送响应,请改为调用CompleteRequest

显然,在调用CompleteRequest后,当前方法仍将继续运行,因此您需要确保干净地完成当前事件的处理。

可以在没有异常的情况下结束请求。 - usr

1

好的,我找到了答案在这里。如果你向下滚动,找到 'Jay Zalos' 的回答。我用以下三行代码替换了 httpResponse.End():

Response.Flush()
Response.SuppressContent = True
HttpContext.Current.ApplicationInstance.CompleteRequest()

我认为这不是一个好的解决方案。你需要使用SuppressContent表明一些奇怪的事情正在发生(生成从未发送的内容...)。此外,Flush会导致性能问题(即使每个请求只执行一次)。请不要将其标记为答案,这会误导未来的访问者认为这是最佳实践。 - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接