0

私の質問では、解決策を実際に探しているわけではありませんが、この奇妙な動作が発生する理由を説明しています。シングルトンには多くの危険性があることを認識しており、可能な限り回避することをお勧めします。

問題は 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;

だから私はシングルトンを実装する2つのクラスを持っています:

  • MainWindow (私の UI が表示されている時間の 99%)
  • SQLCon (データベース クラス)

InitializeTimer()MainWindow の既定のコンストラクターで毎秒実行されるTimer () を初期化すると、奇妙な動作が発生し始めます (したがって、基本的には 1 回だけ開始する必要があります)。

    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
    }

簡単に言うと、DisplayInfoDateTimeは DB からいくつかのフィールド ( ) を照会し、それをラベルに配置するだけです。すべてが数分間正常に動作し、突然負のDateTime値になり、アプリケーションがクラッシュします。

解決策は、実際にはデフォルトのコンストラクターInitializeTimer()から を削除し、プログラムで実行されている他のタイマーに配置することでした。MainWindow

将来これを避けることができるように、考えられる原因は何ですか?

よろしくピート。

4

0 に答える 0