C# 古怪行为的独生子女
在我的问题中,我不是真的在寻找解决方案,而是在寻找一个解释,为什么我会有这种奇怪的行为。我知道单身有很多危险,最好尽量避免 问题发生在两个单例类之间(两个都是线程保存实现) 所以我有两个类都实现了单例:C# 古怪行为的独生子女,c#,.net,wpf,C#,.net,Wpf,在我的问题中,我不是真的在寻找解决方案,而是在寻找一个解释,为什么我会有这种奇怪的行为。我知道单身有很多危险,最好尽量避免 问题发生在两个单例类之间(两个都是线程保存实现) 所以我有两个类都实现了单例: 主窗口(其中99%的时间显示我的UI) SQLCon(数据库类) 现在,当我初始化在MainWindow默认构造函数中每秒运行一次的计时器(InitializeTimer())时,就会出现奇怪的行为(因此基本上它应该只启动一次) 为了保持简短,DisplayInfo只需从数据库中查询几个字段
- 主窗口(其中99%的时间显示我的UI)
- SQLCon(数据库类)
InitializeTimer()
)时,就会出现奇怪的行为(因此基本上它应该只启动一次)
为了保持简短,DisplayInfo只需从数据库中查询几个字段(DateTime
),并将其放置在标签中。
一切正常运行了几分钟,然后突然我得到一个负的DateTime
值,我的应用程序崩溃了
解决方案实际上是从主窗口
默认构造函数中删除InitializeTimer()
,并将其放在我程序中运行的另一个计时器中
可能的原因是什么,以便我将来可以避免这种情况
向Pete致意。如果将单例简化为公共静态只读SQLCon实例=new SQLCon();,会发生什么?我从来没有在实现单例时使用volatile关键字。为什么你认为单例是个问题?您提到了负值
DateTime
值。也许您应该向代码显示实际问题所在的位置。可能是DisplayInfo
。提供获取任何异常的堆栈跟踪。正如@henrik所说,单身汉与约会时间没有任何关系。。。如果问题是单例,你会得到一个NullReferenceException。我有两个计时器都在运行一个查询。当我在主窗口中注释显示信息时,我的应用程序运行良好。如何显示信息?请出示密码。你不在另一个线程中显示它吗?
//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;
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
}