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