2

私はまだ C# を学んでおり、ここで助けが必要です。datetime が初期化されたかどうかを毎秒チェックするディスパッチタイマーがあります。動作しますが、問題は、datetime が終了するまで同じことをやり続けることです。たとえば、datetime でメモ帳を起動したいとします。問題は、dispatchtimer が 1 秒ごとに datetime を検索することです。これは、メモ帳が 1 秒ごとに起動することを意味します。DateTime がメソッドを開始したときに DispatchTimer を停止するにはどうすればよいですか?

コードは次のとおりです。

    private void Start_Click(object sender, RoutedEventArgs e) //Button start.
    {
        test();
    }
    private void startjob() //DateTime checking for DateValue and start's if correct value.
    {
        DateTime? start = DateTimePicker1.Value;
        DateTime? end = DateTimePicker2.Value;
        DateTime now = DateTime.Now;

        if (start == null || end == null)
        {
            Xceed.Wpf.Toolkit.MessageBox.Show("one of the pickers is empty");
        }
        else if (now >= start.Value && now <= end.Value)
        {
            Process notePad = new Process();

            notePad.StartInfo.FileName = "notepad.exe";

            notePad.Start();

        }
    }
    private void test() // DispatchTimer
    {
        DispatcherTimer dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1);
        dispatcherTimer.Start();
    }


        private void dispatcherTimer_Tick(object sender, EventArgs e)
{           
    try
    {
        startjob();
    }
    catch (Exception)
    {

    } 
4

2 に答える 2

2

委任されたイベント ハンドラーにタイマーを停止させることができます。

最初に、startJobメモ帳を起動するかどうかを通知するための簡単な調整 (起動しない場合は、引き続き試してください):

private bool startjob() //DateTime checking for DateValue and start's if correct value.
{
    DateTime? start = DateTimePicker1.Value;
    DateTime? end = DateTimePicker2.Value;
    DateTime now = DateTime.Now;

    if (start == null || end == null)
    {
        Xceed.Wpf.Toolkit.MessageBox.Show("one of the pickers is empty");
    }
    else if (now >= start.Value && now <= end.Value)
    {
        Process notePad = new Process();

        notePad.StartInfo.FileName = "notepad.exe";

        notePad.Start();
        return true;
    }
    return false;
}

メソッドを投稿しませんでしたが、イベント ハンドラーはタイマー自体であるため、dispatcherTimer_Tickこれを組み込むことができるはずです。sender

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    if (startJob())
    {
        //if notepad was started, stop the timer
        DispatcherTimer timer = (DispatcherTimer)sender;
        timer.Stop();
    }
}

編集:メモ帳を起動するための入力が有効かどうかに関係なく、タイマーを停止することが意図されている場合は、結果/チェックを破棄して、Tick イベントでタイマーをbool呼び出すだけです。Stop()

于 2013-04-14T13:53:10.803 に答える
2

イベントのsenderパラメータは、あなたが扱っているものです。TickDispatcherTimer

次の点を考慮してください。

var disp = new DispatcherTimer();
disp.Interval = new TimeSpan(0, 0, 0, 1);
disp.Tick += (object sender, EventArgs e) => {
  ((DispatcherTimer)sender).Stop();
};

これにより、タイマーが最初に作動したときにタイマーが停止します。

于 2013-04-14T13:54:01.783 に答える