奇怪的行为Singleton

时间:2012-05-16 12:47:36

标签: c# .net wpf

在我的问题中,我并不是在寻找解决方案,而是解释为什么我会得到这种奇怪的行为。我知道Singleton有很多危险,最好尽可能避免。

2个单例类(两个线程保存实现)之间出现问题

      //Thread Safe Singleton
    private static volatile SQLCon instance;
    private static object syncRoot = new Object();

    public static SQLCon Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                        instance = new SQLCon();
                }
            }
            return instance;

所以我有两个类都实现了单例:

  • MainWindow(显示我的UI的99%)
  • SQLCon(数据库类)

当我初始化在MainWindow默认构造函数中每秒运行的Timer(InitializeTimer())时,奇怪的行为开始发生(所以基本上它应该只启动一次)。

    private MainWindow()
    {
        InitializeComponent();
                    InitializeTimer(); //Wierd behaviour
            }

 private void InitializeTimer()
        {
            timerOrders = new DispatcherTimer();
            timerOrders.Tick += new EventHandler(timer_Tick);
            timerOrders.Interval = new TimeSpan(0, 0, 1);
            timerOrders.Start();
        }

    private void timer_Tick(object sender, EventArgs e)
    {
        SQLConn.Instance.DisplayInfo(); //This is method just queries a DB and fills up a simple dataset
    }

为了简短起见,DisplayInfo只是从数据库中查询几个字段(DateTime)并将其放在标签中。 一切都运行良好几分钟然后突然我得到负DateTime值,我的应用程序崩溃。

解决方案实际上是从InitializeTimer()默认构造函数中删除了MainWindow,并将其放在我的程序中运行的其他计时器中。

可能的原因是什么,以便将来可以避免这种情况?

最好的问候皮特。

0 个答案:

没有答案