IsReusable属性中的上下文切换

时间:2013-07-01 14:13:11

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

IsReusable Property

以下是我对IsReusable财产

的理解

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

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

困惑

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

第2段说可能会发生上下文切换 - 我认为,当您发送请求时。那个时间只创建一个上下文,结果是Response。对?那么,如何进行上下文切换。你能举个例子吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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