应用程序服务器中的多线程

时间:2011-03-29 10:56:41

标签: asp.net multithreading web-applications

“即使您没有明确地在应用程序中使用Threads,如果您正在谈论Web服务器应用程序,它也必然是线程不安全的”。

我只想清楚地理解这一点。假设我有一个宁静的服务(ASP.net;将在图片中讨论asp.net Web应用程序)。如果对同一Web方法A有两个同时请求,则这两个请求将由IIS wp的不同线程提供。现在,这2个线程在做什么?即。这两个线程是否在服务类的同一个实例上访问A?

我们如何验证这两个请求是否在服务类的同一个实例上工作的事实,这样因为在Web方法中访问实例变量,所以这里存在一个不安全的线程

1 个答案:

答案 0 :(得分:0)

>现在,这2个线程在做什么?

IIS的简答题线程。您需要澄清IIS的架构 - 将此视为独立程序。它可以插入(动态加载)大量的DLL。其中一个是ASP.Net拦截器(它接受扩展看起来像* .aspx,* .ashx,...)另一方面,这个DLL加载你的代码生成的DLL。因此,处理来自客户端IIS的请求(一般情况下)启动线程(让我跳过池的讨论)。

>我们如何验证这两个请求是否在同一服务类实例上工作的事实

在上面的场景中,您不需要验证,因为ASP.Net将根据您的需要创建任意数量的实例。使用异步请求功能时会出现此问题(请参阅http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

<%@ Page Async="true" ... %> 

或手动启动一些线程。 在这两种情况下,您都可以应用非常强大的同步原语集来检测是否在2个或更多线程之间共享某些资源。使用原子增量(Interlocked.Increment/Decrement)或使用TryEnter方法监视(有关详细信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc188793.aspx