【发布时间】:2010-12-10 16:39:20
【问题描述】:
我有一个关于在 IIS (6,7,7.5) 和 ASP.NET 4.0 Web 应用程序(具体来说是 MVC3 应用程序)中运行的单例的问题。
我的项目中有一个单例对象,可以在 global.ascx、application_start 以及应用程序中的其他一些地方访问和使用它。
我担心的是,这个单例需要在每个实例场景中都可以访问。但是,由于 IIS 本质上是托管进程,那么单例是否会在应用程序的所有实例中成为同一个对象?
如果我使用 [ThreadStatic] 关键字,它是否在应用程序池级别分开?
最后,有没有办法,我可以保证单例只是我的应用程序的每个实例的单例。即,如果我在 1 个网站上运行我的应用程序,但在 5 个虚拟目录中,则有 5 个单例实例,或者如果我在同一应用程序池中的 5 个不同网站上运行我的网站。
希望这已经足够清楚了,如果您想查看单例对象,我将其大致概念粘贴在下面。
public sealed class Singleton : IDisposable
{
[ThreadStatic]
private static volatile Singleton _instance;
[ThreadStatic]
private static readonly object _syncRoot = new object();
public bool IsReleased { get; private set; }
public Singleton()
{
IsReleased = false;
}
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock (_syncRoot)
{
if (_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
public void Dispose()
{
IsReleased = true;
Singleton._instance = null;
}
}
【问题讨论】:
-
我还是一头雾水。你知道它是如何工作的还是你不知道?你能把问题说清楚一点吗?
-
我知道单例如何在每个进程级别“工作”。问题是 IIS 如何在我的应用程序的多个实例中处理它。
-
只是出于好奇,为什么你的单身人士是一次性的?您是否希望有一段时间希望将其处理掉,然后在有人要求时再次将其复活?在应用程序终止之前,通常不会释放真正的单例。
-
我相信 OP 的问题不清楚,因为他需要阅读 IIS 和回发。一般来说,单例与单个回发无关,而是跨多个回发。因此,仅在会话/视图状态方面讨论单例是相关的。 Viewstate 的定义非常明确,但网络花园和回收时间等复杂且可配置的元素开始发挥作用,尤其是因为 OP 提到了 w3wp.exe。我相信 OP 只需要阅读这些功能,但要从 ASP.NET 生命周期开始。然后进入多线程/公寓/进程。
-
@P.Brian.Mackey:他的问题有什么不清楚的地方?他不是在问单例是否会在多个回发中持续存在,而是在问它是否会在他的 Web 应用程序的多个实例中持续存在。由于 IIS 在单个进程中运行,他能否期望在不同的应用程序实例中拥有他的静态变量的不同实例?