我还在学习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)
{
}
答案 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();
};
这会在第一次滴答时停止计时器。