IHttpHandler.IsReusable有什么用?

时间:2011-03-31 13:51:33

标签: c# asp.net asp.net-mvc ihttphandler system.web

我正在编写IHttpHandler,我需要实现IsReusable属性。当我看到MSDN documentation它说:

  

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

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

跟进问题:

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

3 个答案:

答案 0 :(得分:93)

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

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

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

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

答案 1 :(得分:11)

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

这是一个问题,显示当使用不当时会发生什么:

Streaming Databased Images Using HttpHandler

答案 2 :(得分:5)

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

修改

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