关于静态对象的问题 .net

4
静态变量的值在一个会话中是相同的,还是它们的值在应用服务器级别上是相同的?

这是一个不正确的问题:静态对象 - 它是完整.NET应用程序的常见对象 - 在Session对象或Application对象Web服务器上下文中谈论它是不正确的。但是回答你的问题,一个静态对象 - 是在你的Web应用程序中所有会话中共享的一个公共对象。 - Sergey Shulik
1
在谷歌或者stackoverflow上搜索一下就可以解决你的问题并且节省时间。 :) 在stackoverflow上的第一个结果给了我这个链接 --> https://dev59.com/JEfRa4cB1Zd3GeqP947x 。搜索链接 --> http://stackoverflow.com/search?q=asp.net+static+variables - deostroll
3个回答

11

它们处于一个 AppDomain 级别 - 不论这些静态变量是否在 ASP.NET 中,都是相同的。

因此:

  • 如果您从不同的 AppDomains 使用相同的类,则会获得单独的变量。
  • 如果您的 AppDomain 被回收,则会获得单独的变量。
  • 如果两个请求发送到不同的机器,则会获得单独的变量。
  • 如果两个并发 请求命中相同的 AppDomain,则它们可能会互相干扰(因此像 count++ 这样的操作是不安全的)。

我认为最后一个意思是没有锁定,这可能会导致脏读,对吗? - Ken D
1
@LordCover:嗯,不仅仅是脏读 - 除非你小心,否则还有非原子递增。 ' count ++ ' 是一个三阶段操作:读取、递增、写入。两个线程都可以读取,都可以递增,然后都可以写入,导致总共只有一次递增。 - Jon Skeet
如果两个请求发送到不同的机器上,你将会得到不同的变量.. 这是否意味着这些请求来自于2台不同的机器? - Ahsan Iqbal
@Ahsan:不,我的意思是,如果你有一个用于Web应用的服务器群,并且两个请求(无论是来自同一台机器还是不同的机器)分别命中了不同的Web服务器。 - Jon Skeet

0

我认为只要IIS进程存在,静态变量就会保持其值


0
变量会一直存储在内存中,直到应用程序重新启动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接