IHttpHandler.IsReusable有什么用?

Kee*_*ker 102 c# asp.net asp.net-mvc ihttphandler system.web

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

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

这不是很有帮助.在哪种情况下我应该使用可重用的处理程序,在哪种情况下它不应该是可重用的?

跟进问题:

  1. 什么是重用?
  2. 我可以保持状态(即类变量)Reusable = true吗?

Bra*_*nov 93

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

主要的好处是性能,因为垃圾收集的对象会更少.
可重用处理程序最重要的痛点是它必须是线程安全的.这不是微不足道的,需要付出一些努力.

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

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

  • 为了它的价值,我已经实现了许多`IHttpHandler',`IsReusable`设置为`true`并且没有任何问题.要记住的主要事情是不要将任何变量限定在类中,而是在函数中使用局部变量. (6认同)
  • 很棒的解释.明确而且重点.我希望MSDN文章简洁明了. (6认同)
  • 当然.我已经改写了最后一条建议,强调它仅在重用IHttpHandler时才适用.谢谢你的澄清,本! (2认同)

Iri*_*ain 11

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

这是一个问题,显示未正确使用时会发生什么:

使用HttpHandler流式传输数据库图像

  • 像你一样,我在MSDN上找不到令人满意的文档,所以我不得不测试从数据库加载图像到电子商务网站的页面,然后观察发生了什么:) (4认同)

spe*_*der 5

每次请求进入时,回收处理程序比处理新处理程序更便宜,服务器将减少内存,从而简化了GC必须执行的工作.如果处理程序处于处理新请求的状态不会有问题(即处理程序实例中的任何状态已被重置),那么它应该被认为是可重用的.

编辑

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