【问题标题】:Lifetime of a Singleton单身人士的一生
【发布时间】:2012-02-24 13:27:29
【问题描述】:

我正在构建一个 WCF 服务,它托管在 windows 服务 中。 WCF-Service 由 ASP.Net 应用程序使用代理调用。

using (WcfServiceRef.MonitorClient proxy = new WcfServiceRef.MonitorClient())
{
    //WCF Service proxy
    proxy.Open();
    proxy.DoSomething();
}

此外,我有一个单例类 DataAdapter 像这样在 WCF 服务中使用(大多数情况下,它只是将调用转发到 DataAdapter,以便能够更改实际数据访问容易):

DataAdapter.GetInstance().DoSomething();

我的 DataAdapter 看起来像这样,它保存着应该保持活动状态的 myData:

public static DataAdapter DataAdapterInstance;
    private List<CustomObjects> myData;

    internal static ServiceAdapter GetInstance()
    {
        if (DataAdapterInstance == null)
        {
            DataAdapterInstance = new DataAdapter();
        }
        return DataAdapterInstance;
    }

现在我遇到了麻烦:(我不确定我在这里写的所有内容是否正确)

  • “Windows 服务”理论上永远运行(应该如此)
  • WCF 服务仅在由我的代理调用/创建时运行(来自 asp.net)

我的 DataAdapter(包含我的所有数据)什么时候“死掉”......所以我在这里问的是实际上没有引用时对象的生命周期是多少。 (我会说它在垃圾收集器运行时收集) - 我认为我的方法不太好,我将不胜感激有关如何存储我的数据的任何建议(最好不使用数据库或外部文件)

感谢您调查我的问题!

【问题讨论】:

    标签: c# asp.net service singleton


    【解决方案1】:

    静态引用是 GC 的“根”引用,因此它们“永远不会”消亡(直到 AppDomain 被卸载)

    【讨论】:

    • 谢谢! “从不”听起来不错:P 但“卸载 appDomain”是什么意思?当托管 Windows 服务停止时,这是在我的场景中吗?
    • .NET 中的应用程序“由”AppDomains 组成。通常它只是一个 AppDomain,除非您明确创建更多。任何 [托管] 代码都在 AppDomain 中执行。如果您不使用 AppDomains 做任何事情,那么您只有一个,一旦您的应用程序停止,它将被卸载。在这种情况下,所有静态变量直到最后都是“活动的”。
    • 通过停止,这是否意味着当应用程序通过停止和重新启动(回收)或操作系统关闭等手动停止时?不会有任何应用程序因不活动而停止和启动的情况吗?
    【解决方案2】:

    由于您的 DataAdapterInstance 是静态的,因此在加载它的 AppDomain 卸载之前不会收集它 - 这在大多数情况下意味着只有在您的应用程序关闭后才会收集它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多