【问题标题】:Context Switching in IsReusable PropertyIsReusable 属性中的上下文切换
【发布时间】:2013-07-01 14:13:11
【问题描述】:

IsReusable 属性

以下是我对IsReusable属性的理解

如果处理程序返回静态内容。将值设置为 true 是安全的。但是如果线程返回动态内容,为了线程安全,IsReusable应该设置为false。

在这种情况下,可能会发生上下文切换,这可能会导致处理程序给出错误的输出。

困惑

上下文切换 说 - 将一个线程切换到另一个线程称为切换。对吧?

第 2 段说可能会发生上下文切换 - 我认为,当您发送请求时。那个时候只有一个上下文创建,这导致Response。正确的?那么,上下文切换是如何可能的。可以举个例子吗?

【问题讨论】:

  • 有问题的房产的链接会很好
  • 我说得对,您问的是IHttpHandler.IsReusable Property。你不是第一个在理解这个属性时遇到麻烦的人。您可以检查 [next answer 和 cmets of ](stackoverflow.com/a/5501138/182344)。在我看来,@Branislav Abadjimarinov 以聪明而简单的方式解释了这个属性。
  • 你的目的到底是什么?

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

处理程序“返回”的问题(更好的措辞:处理程序写入的内容)与IsReusable 属性无关。该属性声明了代码的线程安全性,而不是内容是否可以更改。例如,写入DateTime.Now 的处理程序将是可重用的。具有SqlConnection 字段并读取不变数据的处理程序将不可重用,因为即使读取的数据始终相同,连接也不是线程安全的。

上下文切换也与此无关,因为在多核机器上,不需要上下文切换来引起并发。您的意思是“线程安全”,即在 IHttpHandler 派生类的同一实例上并发调用 ProcessRequest

现在一些实用的建议:始终让IsReusable 返回 false 并确保您的处理程序类分配成本低且不会带来大量垃圾。 GC'ing 单个对象什么都没有!我的猜测是,创建 IsReusable 属性是为了在玩具基准测试中为 ASP.NET 提供人为优势,或者支持创建成本高昂且架构不佳的处理程序。

如果您有昂贵的资源(如缓存),请将它们存储在其他地方(可能在静态字段中)。

获得线程安全的一个简单方法是不共享任何内容。从这个意义上说,不要共享处理程序。

TL;DR:IsReusable 设置为 false 并继续。这没东西看。这只是 ASP.NET 中一个令人困惑的设计缺陷。

【讨论】:

  • 第 2 段说可能会发生上下文切换 - 我认为,当您发送请求时。那个时候只创建一个上下文,这会产生一个响应。正确的?那么,上下文切换是如何实现的。您能在问题中解释这部分吗?
  • 上下文切换是并发问题的一个特例。上下文切换可以在任何时间和多次发生。这适用于所有线程,而不仅仅是 IIS。 “只有一个上下文创建”不确定您的意思。即使 IsReusable 为 true,每次调用 ProcessRequest 都会收到不同的 HttpContext。 IsReusable 不会改变处理 HTTP 请求和发送响应的方式。它对内容没有任何影响。
  • 当您发送请求时,这会在asp.net网页中创建一个页面的新对象(网页派生自HttpHandler并在内部创建一个页面实例并在其后调用页面事件)。我有点跑题了。但是试图完全理解它......如果这是真的,那么上下文切换发生在哪里?对于每个 Session,只有一个 Context。将创建请求。那么,它什么时候更改了对任何中间作业的请求?
  • 上下文切换与 ASP.NET 无关。如果您不同意这一点,请说出来。使用“上下文”,您可能是指 HttpContext?那不一样。我们需要先清理术语。确保您理解这两个术语的含义。 “对于每个 Session,只有一个 Context” 这里的 Context 到底是什么意思? ASP.NET 会话与任何类型的上下文之间没有任何关系。 “那么,它什么时候改变了对任何中间工作的要求?”不清楚!它?工作?中间的?我无法解释你的句子。
  • 其实我也不是很清楚上下文切换到底是什么意思?
猜你喜欢
  • 2011-04-12
  • 2021-04-07
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2017-09-09
  • 2011-07-27
  • 2013-04-21
相关资源
最近更新 更多