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

誰かがそれを説明できるでしょうか?

InitTimmersプログラムの開始時にパブリックMainWindow()デフォルトコンストラクター内で呼び出されます。

ボタンのクリックが発火し、タイマーがカチカチ音をたてる、私はそれを確認しました。ボタン クリックでは にStartTime初期化されるDateTime.Nowため、null と等しくありませんが、タイマー ティックでは null と等しくなります。テストのStartTimeために、脅迫ウィンドウ内に設定したので、nullではなく、式 はもう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_Tickおよびハンドラーにブレークポイントを設定すると、btnStart_Clickおそらくハンドラーが最初に呼び出されることがわかりますDispatcherTimer_Tick...したがって、StartTimeプロパティはまだ設定されていません。

Button連続してクリックした後でも、値がまだ であると言っている場合は、別の場所にnull設定しているnullか、btnStart_Clickハンドラーが呼び出されていません...正しく配線されていますか?

于 2013-09-10T11:35:50.063 に答える