bool IsReusable在http处理程序界面中的意义


Answers:


152

处理程序的常规入口点是ProcessRequest方法。但是,您可能在类构造函数中有代码,这些代码将一些实例值组合在一起,这些实例值的构建成本很高。

如果将Reusable指定为true,则应用程序可以缓存该实例,并通过简单地一次又一次地调用其ProcessRequest方法来在另一个请求中重用该实例,而不必每次都对其进行重构。

应用程序将实例化处理当前负载所需数量的这些处理程序。

不利的一面是,如果所需实例的数量大于当前存在的实例,则它们将导致使用更多的内存。相反,它们的实例值将在GC周期中幸存下来,并且不需要经常重新分配,因此还可以减少明显的内存使用。

另一个警告是,您需要确保在ProcessRequest执行结束时,对象状态与您希望另一个请求重用该对象的状态相同。


2
您提到对象重用是通过指定IsReusable = True实现的关键优化。将设置IsReusable = False将导致服务器永远不会实例化处理程序的多个实例。IE-是否消除并发请求?
伊恩2015年

@Ian我相信当reuseable为false时,它然后会像普通页面一样工作,尽管我可能是错的。当可重用时,它可能能够处理2个或3个实例的6个并发请求(仅作为示例),而当不可重用时,它将需要1:1实例/进程。我无法想象.Net会在不断刷新/重新初始化其状态的同时,让1个工作线程试图处理所有请求而堆积请求。
DavidScherer

47

除了AnthonyWJones的答案,如果您的HTTP处理程序返回trueIsReusable则应确保它是完全线程安全的。

文档中没有任何内容表明可重用的处理程序不能同时重用,尽管当前的Microsoft实现似乎只能连续地重用它们。但是,至少在理论上,单个处理程序实例可以被多个请求同时重用,因此您不应依赖任何可能被其他并发线程修改的数据。


抱歉,太厚了,但是请您详细说明“上下文切换”的含义。如果您从sesson或查询字符串(content.Request.QueryString)访问内容,是否可以重用?
zod 2011年

5
上下文切换是指CPU在一个线程上停止处理而在另一个线程上开始处理时。IE CPU将其上下文从一个线程切换到了另一个线程。这种情况在PC中不断发生,给我们一种在多核计算机出现之前就可以进行多任务处理的错觉。
拉里·杜克

我不明白你何时说随时可能进行上下文切换。当我们键入url并按Enter键时,它将一次执行一个请求。对 ?

当多个用户同时使用一个应用程序时,上下文切换将成为一个问题。例如,如果两个用户想同时更新同一条记录,则上下文切换可能会引起问题。
Ishmael Smyrnow 2013年

7
关于IsReusable要求线程安全的声明似乎与AnthonyWJones的回答相矛盾。据我了解,它的第三段(应用程序将实例化尽可能多的...),一个可重用的处理程序实例将不会被同时重用,而只会在完成当前处理之后再使用。如果是这样,则不需要线程安全。
弗雷德里克

3

如果您没有在该实例中存储任何状态(即:您没有任何字段(也称为“类变量”)),则应该安全地重用它。

出于安全考虑,默认情况下为false。

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.