【问题标题】:ThreadStatic member lose value on every page loadThreadStatic 成员在每次页面加载时都会失去价值
【发布时间】:2010-08-20 13:34:28
【问题描述】:

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

[ThreadStatic]
private static BackgroundProcessManager2 _Instance;

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

通常一切都很好,但是这次在每个页面加载时 _Instance 都是空的。

此外,我在尝试观看标记为 ** 的行中的 _Instance 时遇到了非常奇怪的错误:

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

这个类可以上传什么?

【问题讨论】:

  • 嗯。您正在尝试使用 asp.net 启动线程?这实际上是在这里被解雇的理由......
  • 你在使用windows服务吗?
  • 是的。但是 ASP.NET 没有自己的线程。通常我们只是从 ASP.NET 启动一个单独的进程来解决这个问题。

标签: asp.net threadstatic


【解决方案1】:

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

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

【讨论】:

  • 谢谢,看来我昨天工作太晚了。 t当我只需要正常的静态时就是这种情况。
  • @Sergey,如果您在 ASP.NET 等多线程环境中使用静态变量,请确保正确同步。
  • @DarinDimitrov,我在 VS 中调试我的一个应用程序时收到完全相同的消息:instanceLock 无法获取字段“instanceLock”的值,因为有关包含类的信息不可用。目的。似乎几个类的静态字段之间存在交叉引用,这导致它们的实例的构建没有完成。请您简要描述一下避免这种情况发生的策略吗?如果您更愿意亲自与我联系:dnovatchev at gmail dot com。非常感谢您抽出宝贵时间。 Blagodaria ti,达林。
  • @DarinDimitrov,请忽略我之前的评论。我发现这是 VS2013 的问题,安装最新的 VS2013 更新解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多