在ASP.NET网站上,是每个Web请求唯一的静态类,还是在需要时实例化它们并在GC决定处理它们时进行GC操作?
我问的原因是因为我之前在C#中编写了一些静态类,并且行为与我预期的不同.我希望静态类对每个请求都是唯一的,但似乎并非如此.
如果它们并非每个请求都是唯一的,那么有没有办法让它们成为现实?
更新:
答案给了我正是我所需要的.我已经在使用单例类,但是它使用的是一个静态实例,因此即使用户不同也在请求之间共享,在这种情况下这是一件坏事.使用HttpContext.Current.Items完美地解决了我的问题.对于任何在将来偶然发现这个问题的人来说,这是我的实现,简化和缩短,以便易于理解模式:
using System.Collections;
using System.Web;
public class GloballyAccessibleClass
{
private GloballyAccessibleClass() { }
public static GloballyAccessibleClass Instance
{
get
{
IDictionary items = HttpContext.Current.Items;
if(!items.Contains("TheInstance"))
{
items["TheInstance"] = new GloballyAccessibleClass();
}
return items["TheInstance"] as GloballyAccessibleClass;
}
}
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
ASP .NET Singleton
我知道单例类和具有静态属性/方法的类之间的一般差异,但我想知道它如何影响ASP.NET MVC Web应用程序中的并发性(许多用户登录应用程序)?例如,我们将设置存储在我们的单例(或静态属性)类中.两个用户是否有可能突然开始看到/共享相同的设置?我的意思是,如果一个用户更改了他的设置(因为它们存储在应用程序运行时的内存中),它会影响其他用户吗?据我所知,IIS为应用程序创建了一个w3wp.exe进程,因此所有用户/访问者都将在同一进程中,因此这会对任何内容产生影响吗?