将引用保持为Singleton对象

时间:2012-11-20 11:24:03

标签: c# .net garbage-collection

我有一个Singleton对象,它持有WCF方法的代理。从代码中的几个点调用的Singleton对象包括COM对象。 我的问题是:

  1. GC是否可以决定释放该对象,即使我稍后会使用它(例如在COM中)?
  2. 我如何确定何时Dispose()此对象?使用~Finalizer()方法是个好主意?或者可能是GC决定在我使用它之前完成它?
  3. 来电GC.KeepAlive(this)可以解决问题吗?
  4. 谢谢!

    编辑:

    public class Singleton
    {
        private static Singleton instance = null;
        public static Singleton GetInstance()
        {
            if (instance == null)
                {
                    lock (syncObject)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton(); 
                        }
                    } 
                }
                return instance;
        }
        public void CallWcfMethod()
        {
            // ....
        }
    }
    
    public class Class1
    {
        Singleton instance = Singleton.GetInstance();
    
        public void CallWcfMethod()
        {
            instance.CallWcfMethod();
        }
    }
    
    [ComVisible(true)]
    public class Class2
    {
        Singleton instance = Singleton.GetInstance();
    
        public void CallWcfMethod()
        {
            instance.CallWcfMethod();
        }
    }
    

2 个答案:

答案 0 :(得分:0)

如果你想停止垃圾收集,你只需要一种方法来保持对象的引用,最简单的,最适合单身的是这个。

public class Singleton
{
    public static Singleton Instance
    {
        get{ return sInstance;}
    }
    public void CallWcfMethod()
    {
        // ....
    }

    private static Singleton sInstance;
}

这样你就不需要将它存储在你的每个类中,只需调用Singleton.Instance.CallWcfMethod();

答案 1 :(得分:0)

如果您的实例被声明为静态,只要AppDomain仍然存在,就不会收集它,此时您很少需要进行任何特定的清理。