ASP.Net中的线程敏捷性是什么意思?

9

我正在阅读一篇关于HttpContext和CallContext的文章,看到了线程敏捷性。什么是线程敏捷性?


可能是 ASP.NET 是如何支持多线程的? 的重复问题。 - Erik Philips
2
线程敏捷性基本上意味着在请求执行期间,处理请求的线程可能会发生变化。 - Nico
1
根据此链接http://blog.idm.fr/2010/03/aspnet-thread-agility-or-why-threadstatic-should-not-be-used.html,在ASP.Net中,容器可能会在请求处理过程中决定切换线程。这被称为线程敏捷性。 - HatSoft
1个回答

12

这意味着IIS可以使用多个线程来处理单个请求,尽管不是并行执行。

基本上,IIS试图异步执行I/O操作,从而在操作期间释放调用线程。该线程返回到池中,可以在此期间用于处理其他请求。

当异步I/O操作完成时,控制权可以返回给原始处理请求的线程之外的另一个线程(因为该线程可能在其他地方忙碌),因此请求可以尽快继续被处理。


2
唯一的小问题是它可能会随机破坏代码。例如,微软自己的“模式和实践”组织中的EntLib数据访问块有时会混淆请求-响应,因此如果线程发生更改,则会得到与您开始的不同查询的响应。这至少已经在EntLib v5.0中得到了修复,但实际上错误在于ASP.NET,它应该支持任何托管代码。您不应该知道第三方库的实现是否使用FW/CLR的此功能或那个功能。 - The Dag
1
我通过艰难的方式了解到了线程敏捷性。使用log4net,将请求属性分配给ThreadContext后,我最终得到了记录错误请求URL、用户名和IP地址的日志消息。请参见log4net Context problems with ASP.Net thread agility - R. Schreurs
是的,不能使用ThreadContext或CurrentPrincipal来存储数据。相反,您必须分别使用HttpContext.Item和HttpContext.User。 - John Wu
1
@JohnWu 把你的业务逻辑与 ASP.NET 上下文紧密结合在一起,同时也无法进行单元测试。一个由 CallContext 支撑的 <code>public static SomeThing Current</code> 属性可以在单元测试中设置,但一个由 HttpContext 支撑的属性则不行。基本上,你不能使用任何类型的线程存储机制来提供每个线程的分离,所有这些都是因为当 ASP.NET 切换线程时不迁移线程本地存储。捍卫 ASP.NET 中这种明显的设计“错误”真的很奇怪 —— 它创建了一个陷阱,连 Microsoft 自己都掉进去了! - The Dag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接