Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 古怪行为的独生子女_C#_.net_Wpf - Fatal编程技术网

C# 古怪行为的独生子女

C# 古怪行为的独生子女,c#,.net,wpf,C#,.net,Wpf,在我的问题中,我不是真的在寻找解决方案,而是在寻找一个解释,为什么我会有这种奇怪的行为。我知道单身有很多危险,最好尽量避免 问题发生在两个单例类之间(两个都是线程保存实现) 所以我有两个类都实现了单例: 主窗口(其中99%的时间显示我的UI) SQLCon(数据库类) 现在,当我初始化在MainWindow默认构造函数中每秒运行一次的计时器(InitializeTimer())时,就会出现奇怪的行为(因此基本上它应该只启动一次) 为了保持简短,DisplayInfo只需从数据库中查询几个字段

在我的问题中,我不是真的在寻找解决方案,而是在寻找一个解释,为什么我会有这种奇怪的行为。我知道单身有很多危险,最好尽量避免

问题发生在两个单例类之间(两个都是线程保存实现)

所以我有两个类都实现了单例:

  • 主窗口(其中99%的时间显示我的UI)
  • SQLCon(数据库类)
现在,当我初始化在MainWindow默认构造函数中每秒运行一次的计时器(
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
    }