我在asp.net web应用程序中有基本的单例:
[ThreadStatic]
private static BackgroundProcessManager2 _Instance;
public static BackgroundProcessManager2 Instance
{
get
{
if (_Instance == null) // **
{
_Instance = new BackgroundProcessManager2();
}
return _Instance;
}
}
而且通常一切都很好,但这次在每个页面加载_Instance为空。
此外,当我尝试在标记为**的行中显示_Instance时,我有一个非常奇怪的错误:
无法获取字段'_Instance'的值,因为有关包含类的信息不可用。
这堂课可以上传什么?
答案 0 :(得分:4)
ThreadStatic
表示该变量与给定的托管线程相关联。 ASP.NET使用一个线程池来为用户请求提供服务。这意味着每个页面可能来自不同的线程,因此您的实例变量为null,因为每个请求都是从池中的不同线程提供服务,但这是随机的,并且取决于许多因素。
另请注意,用户请求不一定与工作线程相关联。例如,如果您使用异步页面,则页面可以开始在给定线程上处理并在另一个线程上完成。这是one of the reasons为什么应该在ThreadStatic
应该首选的ASP.NET应用程序中避免HttpContext
,因为它总是与用户请求绑定并且与线程无关。