方法启动时停止DispatcherTimer

时间:2013-04-14 13:35:22

标签: c# datetime timer datetimepicker dispatcher

我还在学习C#,我需要一些帮助。 如果datetime已经初始化,我有一个每秒检查一次的调度程序。 它可以工作,但问题是它会继续做同样的事情,直到datetime结束。 例如,我希望datetime启动NotePad。问题是调度员每隔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)
    {

    } 

2 个答案:

答案 0 :(得分: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();
    }
}

编辑:如果您打算停止计时器,无论输入是否有效启动记事本,那么您可以放弃bool结果/检查,只需拨打Stop()即可Tick事件中的计时器。

答案 1 :(得分:2)

sender事件中的Tick参数是您正在处理的DispatcherTimer

请考虑以下事项:

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

这会在第一次滴答时停止计时器。