我正在写一个IHttpHandler
,我需要实现一个IsReusable
属性。当我查看MSDN文档时,它说:
获取一个值,该值指示另一个请求是否可以使用IHttpHandler实例。
这不是很有帮助。在哪些情况下应该使用可重用的处理程序,在什么情况下不应使用可重用的处理程序?
后续问题:
- 什么是重用?
- 何时可以维护状态(即类变量)
Reusable = true
?
我正在写一个IHttpHandler
,我需要实现一个IsReusable
属性。当我查看MSDN文档时,它说:
获取一个值,该值指示另一个请求是否可以使用IHttpHandler实例。
这不是很有帮助。在哪些情况下应该使用可重用的处理程序,在什么情况下不应使用可重用的处理程序?
后续问题:
Reusable = true
?Answers:
此属性指示是否可以使用同一IHttpHandler实例处理多个请求。默认情况下,在请求管道的末尾,放置在HttpApplication的handlerRecycleList中的所有http处理程序都设置为null。如果处理程序可重用,则不会将其设置为null,并且该实例将在下一个请求中重用。
主要收益是性能,因为可以减少垃圾收集的对象。
可重用处理程序最重要的痛点是它必须是线程安全的。这不是小事,需要一些努力。
我个人建议如果仅使用托管资源,则保留默认值(不可重用),因为垃圾收集器可以轻松处理它们。与引入难以发现线程错误的风险相比,可重用处理程序的性能提升通常可以忽略不计。
如果决定重用处理程序,则应避免维护类变量中的状态,因为如果同时访问处理程序实例,则多个请求将写入/读取值。
IHttpHandler
s的IsReusable
设置为true
,并没有遇到任何问题。要记住的主要事情是不要将任何变量的作用域限定为该类,而应在函数中使用局部变量。
显然,这将处理程序保留在内存中并能够处理多个请求。设置为false时,它必须为每个传入请求创建处理程序的新实例。
这是一个问题,显示了如果使用不当会发生什么情况:
每次处理一个请求时,回收处理程序要比重新处理处理程序便宜,服务器将减少内存,从而简化了GC必须执行的工作。如果处理程序处于处理新请求不会出现问题的状态(即,处理程序实例中的任何状态都已重置),则它应被视为可重用。
编辑
我不确定我的答案是否正确定义了什么是重用。它实际上允许并发重用,因此最好以线程安全的方式最好地避免或仔细管理状态。