私の質問では、解決策を実際に探しているわけではありませんが、この奇妙な動作が発生する理由を説明しています。シングルトンには多くの危険性があることを認識しており、可能な限り回避することをお勧めします。
問題は 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
将来これを避けることができるように、考えられる原因は何ですか?
よろしくピート。