2

我还在学习 C#,我需要一些帮助。如果 datetime 已初始化,我有一个 dispatchtimer 每秒检查一次。它可以工作,但问题是它会继续做同样的事情,直到日期时间结束。例如,我希望 datetime 启动记事本。问题是 dispatchtimer 每 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();
    }
}

编辑:如果您的意图是停止计时器,无论输入是否有效以启动记事本,那么您可以放弃bool结果/检查并Stop()在 Tick 事件中调用计时器。

于 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 回答