106

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

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

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

跟进问题:

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

3 回答 3

96

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

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

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

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

于 2011-03-31T14:03:32.973 回答
11

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

这是一个问题,它显示了当它没有正确使用时会发生什么:

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

于 2011-03-31T13:57:13.757 回答
5

每次请求进入时,回收处理程序比重新启动处理程序更便宜,并且服务器将减少内存,从而减轻 GC 必须执行的工作。如果处理程序处于处理新请求不会有问题的状态(即处理程序实例中的任何状态已被重置),那么它应该符合可重用的条件。

编辑

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

于 2011-03-31T13:55:13.923 回答