2009-11-12 58 views
1

看一个非常简单的Web项目,托管在IIS中,带有一个简单的aspx页面,执行一些代码(从db获取一些数据并填充一些控件),以下哪项是真的:了解ASP.Net实例和线程

每个页面请求共享codebehind类的同一个实例。
或每个页面请求都在它自己的代码隐藏类的实例中运行。

是否有一个线程/实例针对每个aspx页面运行。或者一个线程/实例是否覆盖多个页面?

我试图理解,在一个简单的Web项目中,接收100个页面请求,他们将连续运行一个接一个,或多个实例/线程为每个请求?

+1

我并不质疑你的问题的有效性......但我很想知道你为什么对此感兴趣。 – Larsenal 2009-11-12 21:51:18

+0

我试图理解,如果我在代码隐藏中声明和设置对象,并且我的函数需要一些时间,是否需要开始考虑thread安全。 – Andy 2009-11-12 21:58:40

回答

5
  • 每个请求都会获得一个新的代码隐藏类实例。
  • 代码隐藏类的一个实例提供一个请求。
  • 不同时间点的两个请求可能在线程池的同一线程上运行。
  • 并行运行的两个请求每个都得到一个线程(我认为;如果有一些我不知道线程的角落案例,则不是100%确定)。

因此,一个web服务器可以并行处理多个请求,但是当然可以同时处理多少个请求。

2

对于每个请求,类的后面都有一个实例。

嗯,实际上它是一个aspx页面类的实例,它继承自class后面的代码。 (这就是为什么你正在使用的代码隐藏事件处理程序的protected关键字,因此继承类可以访问它们。)

还有,你做一个Server.TransferServer.Execute的情况下,则该请求被转移到另一个页面实例。

有几个线程在IIS处理请求中运行,通常一个请求在一个线程中处理,但在某些情况下请求可以从一个线程移动到另一个线程。

如果有100个请求到达服务器,它将开始在单独的线程中处理其中的几个请求,并将其余的请求放入队列中。值得注意的是,服务器一次只能从每个用户处理一个页面,因此除非使用无会话页面(使其匿名),否则它不会为并行线程中的同一用户处理两个页面,这会使整个线程部分成为很容易。