【问题标题】:Significance of bool IsReusable in http handler interfacehttp handler 接口中 bool IsReusable 的意义
【发布时间】:2010-10-07 01:27:28
【问题描述】:

在编写 http 处理程序/模块时,有一个接口成员需要实现,称为 - bool IsReusable

这个会员有什么意义?如果我将其设置为 false(或 true),这对 Web 应用程序的其余部分意味着什么?

【问题讨论】:

标签: asp.net httphandler ihttphandler


【解决方案1】:

根据 AnthonyWJones 的回答,如果您的 HTTP 处理程序为 IsReusable 返回 true,那么您应该确保它是完全线程安全的。

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

【讨论】:

  • 对不起,有点厚,但有人可以详细说明“上下文切换”是什么意思。如果您从 sesson 或查询字符串 (content.Request.QueryString) 访问内容,是否可重用?
  • 上下文切换是指 CPU 停止处理一个线程并开始处理另一个线程。 IE。 CPU 将其上下文从一个线程切换到另一个线程。这在 PC 中经常发生,它给了我们在多核计算机出现之前多任务处理的错觉。
  • 你说可能随时发生上下文切换,我无法理解。当我们输入 url 并按回车键时,它一次执行一个请求。对吗?
  • 当多个用户同时使用一个应用程序时,上下文切换将是一个问题。例如,如果两个用户想同时更新同一条记录,上下文切换可能会导致问题。
  • 关于IsReusable 要求线程安全的声明似乎与 AnthonyWJones 的回应相矛盾。据我了解它的第三段(应用程序将实例化尽可能多的......),可重用的处理程序实例不会同时重用,但只有在完成其当前处理之后才会重用。如果这是真的,那么就不需要线程安全了。
【解决方案2】:

处理程序的正常入口点是 ProcessRequest 方法。但是,您可能在类构造函数中有代码,这些代码将一些构建起来很昂贵的实例值放在一起。

如果您将 Reusable 指定为 true,则应用程序可以缓存该实例并在另一个请求中重用它,只需一次又一次地调用其 ProcessRequest 方法,而不必每次都重新构建它。

应用程序将实例化尽可能多的这些处理程序来处理当前负载。

缺点是,如果需要的实例数大于当前存在的实例数,则会导致使用更多内存。相反,它们也可以减少明显的内存使用,因为它们的实例值将在 GC 周期中存活并且不需要频繁地重新分配。

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

【讨论】:

  • 您提到对象重用是通过指定 IsReusable=True 实现的关键优化。设置 IsReusable=False 会导致服务器永远不会实例化处理程序的多个实例。 IE。 - 它会消除并发请求吗?
  • @Ian 我相信当 reusable 为 false 时,它​​会充当普通页面,尽管我可能错了。当它可重用时,它可能能够处理具有 2 个或 3 个实例的 6 个并发请求(仅示例),而当它不可重用时,它需要 1:1 实例/进程。我无法想象 .Net 会让请求堆积起来,因为 1 个工作线程试图处理所有请求,同时不断刷新/重新初始化其状态。
【解决方案3】:

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

为了安全起见,默认为 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多