代码之家  ›  专栏  ›  技术社区  ›  theringostarrs

跨对HttpHandler的请求实现单例

  •  0
  • theringostarrs  · 技术社区  · 15 年前

     public static class ServerApplication {
    
    static Service instance = null;
    static readonly object padlock = new object();
    
    /// <summary>
    /// Service singleton.
    /// </summary>
    public static Service Service {
      get {
        lock (padlock) {
          if (instance == null) {
            instance = new Service();
          }
          return instance;
        }
      }
    }
    

    并在HttpHandler中使用如下调用访问它:

    ServerApplication.Service.Process(request);
    

    我已经在服务器上设置了一个断点 instance = new Service(); 与多个请求的行和

    我的目标是一个跨请求存在的服务,因为它加载和缓存了来自文件和数据库的大量数据,这些数据可以在大多数请求中重用。

    3 回复  |  直到 15 年前
        1
  •  1
  •   lod3n    15 年前

    HTTP是设计用来建立几个并发连接的,我不知道你会想破坏它,除非你在页面加载上建立很少的连接。也就是说,也许您可以将HttpHandler保留在会话中?

        2
  •  1
  •   nitzmahone    15 年前

    有几件事:

    • 如果它是一个多处理器框,从技术上讲,您应该使用“volatile”关键字标记共享服务实例,或者使用对MemoryBarrier的调用(请参阅 http://blogs.msdn.com/brada/archive/2004/05/12/130935.aspx ).您没有指定体系结构,很难说这是否真的是问题所在,但安全总比抱歉好。
    • 您应该实现双重检查锁(例如,在获取“挂锁”上的锁之前和之后检查null)。通过这种方式,您可以进行更便宜的比较,而不是在所有后续读取中获取锁。

    这应该涵盖并发方面的内容。也有可能(尽管可能性较小)在请求之间卸载AppDomain(即,您在web目录中编写了一个文件,导致ASP.NET认为您的应用程序已过时),这将导致重置静态。

        3
  •  0
  •   H4mm3rHead    15 年前

    一般来说,如果您想要一个单例-看不出是否有必要,我通常以这种方式实现它: http://www.vikingworks.dk/page/Creating-a-Singleton-Pattern-i-C.aspx