我在理解IIS如何处理其线程上的静态变量时遇到了一些麻烦。我的理解一直是,如果IIS有4个工作进程,它可以同时处理4个请求,并且它与运行网站的4个独立线程相同。任何静态变量都会在每个单独的线程中保留。我有点困惑的原因是我有一个我管理连接和缓存事务的范围。当我测试应用程序时,我没有注意到任何问题,但在我编译它并同时从两个不同的位置点击它后,我似乎遇到了一些冲突。现在,如果这些工作流程是分开的,为什么会这样?可以同时在单个工作线程上处理多个请求吗?这非常重要,因为这些静态成员中存在唯一的ID来处理管理这些函数的对象的升级,并且看起来他们正试图访问同一个对象。
我在x64机器上的Vista的IIS服务器上运行它。
修改
对于需要在单个请求中保留线程的值,我将这些值放入Web.HttpContext.Current.Items
,这似乎可以解决问题。
<ThreadStatic()>
可以使用,但在请求过程的完整性期间可能无法使用。在我拥有的一个模块中,仅用于变量以指示该线程是否已加载cahcing服务器的设置。如果为true,则说明(不是asp.net)准备从缓存服务器获取数据。
答案 0 :(得分:7)
要改变的第一个概念:如果您使用的是ASP.NET,则它们是ASP.NET线程,而不是IIS线程。
其次,这是一个.NET问题。 静态变量在.NET中的AppDomain
中共享。由于每个IIS应用程序(或多或少)都有一个AppDomain
,这意味着您的静态变量将在应用程序中的所有工作线程之间共享。
将会有超过四个线程,并且它们都将共享相同的变量,这意味着您需要进行锁定,或者您不需要使用静态变量。
无论你的理解是什么,我建议你回过头来弄清楚你从哪里得到这种理解;然后更新它,因为它与ASP.NET没什么关系。
编辑:主题已更改,因此我会稍微更改一下答案。
您必须对这些变量进行互锁访问。或者,您应该考虑重新评估您的设计。您的设计显然假设了一些不同的模型来访问静力学。事实证明这个假设并不正确。这种假设可能会在整个设计中逐步实现。你应该根据现实重新评估你的设计。
答案 1 :(得分:0)
每个工作进程都在自己的AppDomain中运行,因此每个WP都有自己的静态变量实例。
在这里的答案中,它表明在WP之间共享AppDomain是不正确的。
您应该使用.NET连接池,并且应该调查使用(IDisposable){}方法确定连接的范围。