在我的问题中,我并不是在寻找解决方案,而是解释为什么我会得到这种奇怪的行为。我知道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默认构造函数中每秒运行的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
,并将其放在我的程序中运行的其他计时器中。
可能的原因是什么,以便将来可以避免这种情况?
最好的问候皮特。