gpt4 book ai didi

asp.net - 如何防止静态成员变量在 IIS 中一次被多个请求访问?

转载 作者:行者123 更新时间:2023-12-04 04:45:29 26 4
gpt4 key购买 nike

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

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

编辑

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

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

最佳答案

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

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

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

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


编辑:主题已更改,因此我将稍微更改一下答案。

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

关于asp.net - 如何防止静态成员变量在 IIS 中一次被多个请求访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com