我正在编写一个程序,每10或15分钟执行一次操作。我希望它一直在运行,所以我需要一些处理能力便宜的东西。到目前为止我所看到的似乎表明我想使用Timer。这是我到目前为止的代码片段。
class Program {
private static Timer timer = new Timer();
static void Main(string[] args) {
timer.Elapsed += new ElapsedEventHandler(DoSomething);
while(true) {
timer.Interval = TimerMilliseconds(); // The duration of the wait will differ each time
timer.Enabled=true;
}
}
}
这里的问题是while循环只是保持快速执行。如何停止执行直到计时器结束。我的程序真的不需要多线程。 Timer是否适合这项工作?
提前感谢您的帮助!
更新:抱歉让您感到困惑。我已经实现了DoSomething方法。我只是没有包含它,因为我不认为这是我的问题的一部分。
答案 0 :(得分:4)
Timer
将触发Elapsed
事件。
我会做这样的事情:
private static Timer timer = new Timer();
static void Main(string[] args)
{
timer.Elapsed += new ElapsedEventHandler(DoSomething);
timer.Interval = TimerMilliseconds(); // The duration of the wait will differ each time
timer.Enabled=true;
Console.ReadKey(); //Wait for keypress to terminate
}
您也可以将其作为服务实现,这样您就不必像Console.ReadKey
这样阻止调用来阻止程序终止。
最后,您只需更改事件处理程序中的间隔:
static void DoSomething(...)
{
timer.Stop();
timer.Interval = TimerMilliseconds();
...
timer.Start();
}
答案 1 :(得分:2)
此代码的问题在于您使用循环来设置Interval
的{{1}}和Enabled
属性,这些属性将执行所述分配并且 - 它没有等待计时器以某种方式执行。
如果您的应用程序不需要多线程,那么您最好在执行之间调用Timer
。
Thread.Sleep
答案 2 :(得分:1)
完全删除while循环。
DoSomething()函数内部(一旦实现)在启动时停止计时器,并在重新启动计时器之前重置间隔。
答案 3 :(得分:1)
从逻辑中取出定时器和循环。只需使用Windows调度程序在15分钟后执行您的程序。或者您可以使用Windows服务。请阅读Best Timer for using in a Windows service
答案 4 :(得分:0)
我想评论和答案已经提供了你需要的提示,但MSDN docs for Timer实际上提供了一个很好的例子。在我看来,Timer方法有点整洁,更容易阅读你的意图并抽象出调用你的预定代码的细节。
答案 5 :(得分:0)
这是使用ManualResetEvent和WaitOne()的另一种替代方法。这将允许您暂停主线程,而不必担心它会被错误的按键意外杀死。您还可以在满足特定条件时设置()MRE以允许应用程序正常退出:
class Program
{
private static Timer timer;
private static ManualResetEvent mre = new ManualResetEvent(false);
static void Main(string[] args)
{
timer = new Timer(TimerCallback, null, 0, (int)TimeSpan.FromMinutes(15).TotalMilliseconds);
mre.WaitOne();
}
private static void TimerCallback(object state)
{
// ... do something in here ...
Console.WriteLine("Something done at " + DateTime.Now.ToString());
}
}