以下是我对IsReusable
财产
如果处理程序返回静态内容。将值设置为true是安全的。但是如果线程返回动态内容,为了使其线程安全,IsReusable
应设置为false。
在这种情况下,可能会发生上下文切换,这可能导致处理程序提供错误的输出。
困惑
上下文切换说 - 将一个线程切换到另一个线程称为切换。正确?
第2段说可能会发生上下文切换 - 我认为,当您发送请求时。那个时间只创建一个上下文,结果是Response
。对?那么,如何进行上下文切换。你能举个例子吗?
答案 0 :(得分:2)
处理程序“返回”的问题(更好的措辞:处理程序写的内容)与IsReusable
属性无关。此属性声明代码的线程安全性,而不是内容是否可以更改。例如,写入DateTime.Now
的处理程序将是可重用的。具有SqlConnection
字段并读取不变数据的处理程序将不可重用,因为即使读取的数据始终相同,连接也不是线程安全的。
上下文切换也与此无关,因为在多核盒上不需要上下文切换来引起并发。对于ProcessRequest
派生类的同一实例上IHttpHandler
的并发调用,你的意思是“线程安全”。
现在有一些实用的建议:总是让IsReusable
返回false,并确保你的处理程序类分配成本低廉并且不会带来大量的垃圾。 GC的单个对象是没有!我的猜测是IsReusable
属性的创建是为了让ASP.NET在玩具基准测试中具有人为的优势,或者支持构建起来很昂贵的架构处理程序。
如果您有昂贵的资源(如缓存),请将它们存储在其他位置(可能在静态字段中)。
获得线程安全的简单方法是不共享任何内容。从这个意义上讲,不要共享处理程序。
TL; DR:将IsReusable
设为false并继续前进。这没东西看。这只是ASP.NET中一个令人困惑的设计缺陷。