0

在我的问题中,我并不是真的在寻找解决方案,而是在解释为什么我会出现这种奇怪的行为。我知道 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(99% 的时间都在显示我的 UI)
  • SQLCon(数据库类)

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

    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放置在我的程序中运行的另一个计时器中。

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

最好的问候皮特。

4

0 回答 0