ThreadStatic成员在每次页面加载时都会丢失值

时间:2010-08-20 13:34:28

标签: asp.net threadstatic

我在asp.net web应用程序中有基本的单例:

[ThreadStatic]
private static BackgroundProcessManager2 _Instance;

public static BackgroundProcessManager2 Instance
{
     get 
     {
          if (_Instance == null) // **
          {
               _Instance = new BackgroundProcessManager2();
          }
          return _Instance; 
     }
}

而且通常一切都很好,但这次在每个页面加载_Instance为空。

此外,当我尝试在标记为**的行中显示_Instance时,我有一个非常奇怪的错误:

无法获取字段'_Instance'的值,因为有关包含类的信息不可用。

这堂课可以上传什么?

1 个答案:

答案 0 :(得分:4)

ThreadStatic表示该变量与给定的托管线程相关联。 ASP.NET使用一个线程池来为用户请求提供服务。这意味着每个页面可能来自不同的线程,因此您的实例变量为null,因为每个请求都是从池中的不同线程提供服务,但这是随机的,并且取决于许多因素。

另请注意,用户请求不一定与工作线程相关联。例如,如果您使用异步页面,则页面可以开始在给定线程上处理并在另一个线程上完成。这是one of the reasons为什么应该在ThreadStatic应该首选的ASP.NET应用程序中避免HttpContext,因为它总是与用户请求绑定并且与线程无关。