9

IsReusable 属性

以下是我对IsReusable物业的理解

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

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

困惑

上下文切换说-将一个线程切换到另一个线程称为切换。正确的?

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

4

1 回答 1

2

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

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

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

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

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

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

于 2013-07-27T12:59:42.647 回答