5

SomeSingleton在 C# 中有一些课程(如果重要的话 .NET 3.5)和代码:

foo()
{
    ...
    SomeSingleton.Instance.DoSomething();
    ...
}

我的问题是:Garbage Collector 什么时候会收集这个 Singleton 对象?

ps:SomeSingleton的代码:

    private static SomeSingleton s_Instance = null;
    public static SomeSingleton Instance
    {
        get 
        {
            if (s_Instance == null)
            {
                lock (s_InstanceLock)
                {
                    if (s_Instance == null)
                    {
                        s_Instance = new SomeSingleton();
                    }
                }
            }
            return s_Instance;
        }
    }

感谢帮助!

编辑(有解释):

在 Windows Service 我有代码:

   ...
   FirstSingleton.Instance.DoSomething();
   ...

public class FirstSingleton
{
    (Instance part the same as in SomeSingleton)
    public void DoSomething()
    {
        SomeSingleton.Instance.DoSomething();
    }
}

我想要实现的目标:我不在乎 FirstSingleton 会发生什么,但是 SomeSingleton 会在第一次使用它时启动 Timer,所以我需要 SomeSingleton 存在(这样计时器可以每隔一段时间运行新线程),只要我的服务是跑步。

正如我从您的回答中了解到的那样,所有这些都会发生,因为对我的 FirstSingleton 和 SomeSingleton 的引用是静态的,在服务停止之前,GC 不会收集单例,对吗?:)

4

2 回答 2

5

这个问题可以用这个来回答:静态成员是否曾经被垃圾收集?

基本上,当包含的 AppDomain 将被销毁时,该实例将被销毁。

于 2013-08-19T12:41:01.457 回答
1

静态变量引用的对象只有在相关的 AppDomain 被垃圾回收时才会被垃圾回收。在客户端应用程序中,通常只有一个 AppDomain 在整个过程中存在。(一个例外是当应用程序使用插件架构时——不同的插件可能会被加载到不同的 AppDomain 中,而 AppDomain 可能会在以后被卸载。)

参考

于 2013-08-19T12:43:40.897 回答