调试器解锁? VS 2008

时间:2010-08-30 16:34:45

标签: visual-studio-2008 debugging locking

我已经实现了一个效果很好的单身人士......

(像这个例子一样实施:

public sealed class Singleton
{
    static Singleton instance=null;
    static readonly object padlock = new object();

    Singleton()
    {
       //breakpoint
    }

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                Console.WriteLine("test");
                if (instance==null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
}

当Debugger逐步执行构造函数时,锁不再锁定。输出窗口非常,非常,非常频繁地显示测试,然后发生堆栈溢出异常。

我无法发布整个代码,这是一个非常大的例子。 通过以下实现,不会发生错误。

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

有什么问题?如果没有断点,则在任一实现中都不存在错误....

感谢。

迈克尔

1 个答案:

答案 0 :(得分:0)

我发现了问题,但不理解......

我有一个tostring方法,这就是问题(使用反射)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Reflection;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Singleton s = Singleton.Instance;
            Console.ReadLine();
        }
    }

    class Singleton
    {

        static Singleton instance = null;
        static readonly object padlock = new object();

        Singleton()
        {
        }

        public static Singleton Instance
        {
            get
            {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                return instance;
            }
        }
        public override String ToString()
        {
            StringBuilder str = new StringBuilder();
            object myObject = this;
            // werden nicht alle gewünscht Properties angezeigt, müssen ggf. die Bindingflags
            // in GetProperties umgesetzt werden http://msdn.microsoft.com/de-de/library/system.reflection.bindingflags%28VS.95%29.aspx
            foreach (PropertyInfo info in myObject.GetType().GetProperties())
            {
                if (info.CanRead)
                {
                    object o = info.GetValue(myObject, null);
                    if (o != null)
                    {
                        // mit typ: o.GetType()
                        str.Append(info.Name + "\t\t" + o.ToString() + Environment.NewLine);
                    }
                }
            }
            return str.ToString();
        }


    }
}