0

我有私人领域

private DateTime? StartTime;

我在按钮单击时设置该字段

private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            StartTime = DateTime.Now;
        }

但是当我从 EventHandler 访问该字段时

private void InitTimers()
        {
            DispatcherTimer dispatcherTimer = new DispatcherTimer();

            dispatcherTimer.Tick += DispatcherTimer_Tick;
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
            dispatcherTimer.Start();
        }

        private void DispatcherTimer_Tick(object sender, EventArgs e)
        {
            lbTime.Content = DateTime.Now.ToString("HH:mm:ss");
            lbTodayDate.Content = DateTime.Now.ToString("MM/dd/yyyy");

            if(StartTime != null) //Always null
                lbElipsedTime.Content = DateTime.Now - StartTime;

            CommandManager.InvalidateRequerySuggested();
        }

StartTime永远存在null

可能有人可以解释一下吗?

InitTimmersMainWindow()程序启动时在公共默认构造函数中调用。

按钮点击触发,计时器滴答作响,我已经检查过了。在按钮单击上StartTime初始化为DateTime.Now,因此它不等于 null,但在计时器滴答时它等于 null。只是为了测试我StartTime在恐吓窗口内设置所以它不再为空并且 不再if(StartTime != null)表达false

更新

好的,我做了一些愚蠢的事情,我正在运行异步方法,关键就在那里:

 private void btnStart_Click(object sender, RoutedEventArgs e)
            {
                StartTime = DateTime.Now;
                DoAsyncMethod(); //should do StartTime = null inside.
                StartTime = null
            }

我应该StartTime = null在异步方法里面做,就是这样,谢谢你们。

4

2 回答 2

3

我刚刚在测试应用程序中使用了这段代码,它工作正常。在此处添加代码以进行比较:

在此处输入图像描述

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private DateTime? StartTime;

        public MainWindow()
        {
            InitTimers(); 
            InitializeComponent();
        }


        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            StartTime = DateTime.Now;
        }

        private void InitTimers()
        {
            DispatcherTimer dispatcherTimer = new DispatcherTimer();

            dispatcherTimer.Tick += DispatcherTimer_Tick;
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
            dispatcherTimer.Start();
        }

        private void DispatcherTimer_Tick(object sender, EventArgs e)
        {
            if (StartTime != null) //Always null
                lbElipsedTime.Content = DateTime.Now - StartTime;

            CommandManager.InvalidateRequerySuggested();
        }
    }
}
于 2013-09-10T11:45:36.970 回答
0

如果您在DispatcherTimer_TickbtnStart_Click处理程序中放置一个断点,您可能会发现DispatcherTimer_Tick首先调用了处理程序......因此StartTime尚未设置该属性。

如果您说即使在连续Button单击之后,该值仍然 null是,那么您将其设置为null其他位置,或者您的btnStart_Click处理程序没有被调用......您确定它连接正确吗?

于 2013-09-10T11:35:50.063 回答