在我的问题中,我并不是真的在寻找解决方案,而是在解释为什么我会出现这种奇怪的行为。我知道 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
放置在我的程序中运行的另一个计时器中。
可能是什么原因,所以我将来可以避免这种情况?
最好的问候皮特。