C#暂停程序执行

时间:2015-01-07 20:45:07

标签: c#

我正在编写一个程序,每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方法。我只是没有包含它,因为我不认为这是我的问题的一部分。

6 个答案:

答案 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());
    }

}