2

我在理解 IIS 如何处理其线程上的静态变量时遇到了一些麻烦。我的理解一直是,如果 IIS 有 4 个工作进程,它可以同时处理 4 个请求,并且它与有 4 个单独的线程运行网站相同。任何静态变量都将保留在每个单独的线程中。我有点困惑的原因是我已经创建了一个范围来管理连接和缓存事务。当我测试应用程序时,我没有注意到任何问题,但是在我编译它并从两个不同的位置同时点击它之后,我似乎遇到了一种冲突。现在,如果这些工作进程是分开的,为什么会这样呢?可以在单个工作线程上同时处理多个请求吗?这一点非常重要,因为在这些静态成员中保存了唯一的 ID,以处理管理这些功能的对象的升级,并且看起来它们正试图访问同一个对象。

我在 x64 机器上的 Vista 的 IIS 服务器上运行它。

编辑

对于需要在单个请求上通过线程持续存在的值,我将这些值放入Web.HttpContext.Current.Items其中似乎可以解决问题。

<ThreadStatic()>可以使用,但在整个请求过程中可能不可用。在我拥有的一个模块中,仅在变量上使用以指示该线程是否已经加载了 cahcing 服务器的设置。如果为真,则tread(不是asp.net)准备好从缓存服务器获取数据。

4

2 回答 2

7

要更改的第一个概念:如果您使用的是 ASP.NET,它们是 ASP.NET 线程,而不是 IIS 线程。

其次,这是一个 .NET 问题。静态变量在整个AppDomain.NET 中共享。由于AppDomain每个 IIS 应用程序(或多或少)都有一个,这意味着您的静态变量将在应用程序中的所有工作线程之间共享。

将有超过四个线程,并且它们都将共享相同的变量,这意味着您要么需要进行锁定,要么不需要使用静态变量。

不管你一直以来的理解是什么,我建议你回过头来弄清楚你是从哪里得到这种理解的;然后更新它,因为它与 ASP.NET 没有太大关系。


编辑:主题已经改变,所以我会稍微改变一下答案。

您必须互锁对这些变量的访问。或者,您应该考虑重新评估您的设计。您的设计显然假设了一些不同的模型来访问静态。这个假设被证明是不正确的。这种假设可能已经在您的设计中级联。你应该根据现实重新评估你的设计。

于 2009-04-07T21:38:18.127 回答
0

每个工作进程都在自己的 AppDomain 中运行,因此每个 WP 都会有自己的静态变量实例。

在这里的答案中,它表明 AppDomain 是跨 WP 共享的,这是不正确的。

不过,您应该使用 .NET 连接池,并且您应该研究 using(IDisposable){} 方法来确定连接范围。

于 2016-04-07T02:44:50.137 回答