IHttpHandler.IsReusable有什么用?


104

我正在写一个IHttpHandler,我需要实现一个IsReusable属性。当我查看MSDN文档时,它说:

获取一个值,该值指示另一个请求是否可以使用IHttpHandler实例。

这不是很有帮助。在哪些情况下应该使用可重用的处理程序,在什么情况下不应使用可重用的处理程序?

后续问题:

  1. 什么是重用?
  2. 何时可以维护状态(即类变量)Reusable = true


“重用”是指使用处理程序的特定实例处理多个请求。您可以在Session中存储任何内容-释放处理程序实例时,它不会受到影响。
IrishChieftain

@IrishChieftain就像.Net保留了一袋实例化的HttpHandlers,选择一个并只是将其提供上下文?
Kees C. Bakker

1
@IrishChieftain现在,我将其用于一些日志信息的简单流光。但是我正在尝试了解含义,以了解何时以及如何使用IHttpHandlers。它们是许多人遗忘的功能。
Kees C. Bakker

Answers:


93

此属性指示是否可以使用同一IHttpHandler实例处理多个请求。默认情况下,在请求管道的末尾,放置在HttpApplication的handlerRecycleList中的所有http处理程序都设置为null。如果处理程序可重用,则不会将其设置为null,并且该实例将在下一个请求中重用。

主要收益是性能,因为可以减少垃圾收集的对象。
可重用处理程序最重要的痛点是它必须是线程安全的。这不是小事,需要一些努力。

我个人建议如果仅使用托管资源,则保留默认值(不可重用),因为垃圾收集器可以轻松处理它们。与引入难以发现线程错误的风险相比,可重用处理程序的性能提升通常可以忽略不计。

如果决定重用处理程序,则应避免维护类变量中的状态,因为如果同时访问处理程序实例,则多个请求将写入/读取值。


1
您最近一次避免在类变量中保持状态的建议有些令人困惑。假设将IsReusable设置为false,那么是否不可能有另一个请求(并发与否)访问该HttpHandler的相同实例,因此在类变量中维护状态将是安全的?
本·阿马达

2
当然。我重述了最后一个建议,强调仅在重用IHttpHandler时才适用。谢谢您的澄清,本!
Branislav Abadjimarinov

7
对于它的价值,我已经实现了很多很多IHttpHandlers的IsReusable设置为true,并没有遇到任何问题。要记住的主要事情是不要将任何变量的作用域限定为该类,而应在函数中使用局部变量。
dana 2014年

6
很好的解释。清晰明确。我希望MSDN文章这么简洁。
AlexVPerl 2015年

1
@Branislav-如果我理解您的回答正确。不仅可能使不同的线程同时使用处理程序的不同实例,而且还可能使不同的线程同时执行处理程序的SAME实例?
伊恩2015年

11

显然,这将处理程序保留在内存中并能够处理多个请求。设置为false时,它必须为每个传入请求创建处理程序的新实例。

这是一个问题,显示了如果使用不当会发生什么情况:

使用HttpHandler流式处理数据库图像


您是否有一些文档支持您的答案?
Kees C. Bakker

4
像您一样,我在MSDN上找不到满意的文档,因此我不得不测试将图像从数据库加载到电子商务站点的页面,然后观察发生了什么:)
IrishChieftain 2011年

5

每次处理一个请求时,回收处理程序要比重新处理处理程序便宜,服务器将减少内存,从而简化了GC必须执行的工作。如果处理程序处于处理新请求不会出现问题的状态(即,处理程序实例中的任何状态都已重置),则它应被视为可重用。

编辑

我不确定我的答案是否正确定义了什么是重用。它实际上允许并发重用,因此最好以线程安全的方式最好地避免或仔细管理状态。


我也这么认为。没错,实际的(基本)问题是:“重用是什么?”
Kees C. Bakker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.