在Windows服务上定义的时间后运行方法

时间:2017-06-06 11:10:59

标签: c# .net windows-services

我的问题更多的是关于到达同一目的地,但必须有另一种方式。现在我创建一个DateTime并将其与另一个DateTime进行比较并检查,如果我设置的时差可能是正确的。到目前为止一切都那么好,但我不能接受每次循环进入该代码时我都会创建一个新属性。

有没有办法到达同一个目的地,但是以某种更有效的方式?

我在这里给你们一些示例代码:

        private void RunService()
        {
            // Runs as long as the service didn't got a stop call.
            while (!SetStop)
            {
                //Get MinutesToWait
                this.MinutesToWait = 5;

                DateTime CheckRunTime = this.LastRun;
                CheckRunTime.AddMinutes(this.MinutesToWait);

                if (DateTime.Now >= CheckRunTime)
                {
                    // Imagine some good and smart and totally runnable code?
                }
            }
        }

2 个答案:

答案 0 :(得分:0)

使用System.Timers

static void Main(string[] args) {

        Timer T = new Timer();
        T.Elapsed += Run;
        T.Interval = 100;
        T.Start();

}
static void Run(object source, ElapsedEventArgs e) {

}

答案 1 :(得分:0)

如果我理解正确,您想要做的是在服务启动后的某个时间执行一段代码。如果是这种情况,那么最好的办法就是使用timer

首先,你必须将你想要等待的时间转换为毫秒。例如,5分钟等于300000ms。然后,您必须将要执行的代码移动到单独的方法。我将为此示例命名此方法RunCode()。最后,您可以像这样创建计时器:

private void RunService()
{
    var timer = new Timer(300000);
    timer.Elapsed += (s, e) => this.RunCode();
    timer.Start();
    Thread.Sleep(Timeout.Infinite);
}

我们在这里做的是以下内容。

  1. 以300000ms的间隔实例化计时器
  2. 订阅计时器的Elapsed事件,该事件在指定时间过后触发
  3. 启动计时器
  4. 永远沉睡我们的主线。这一行是可选的。是否需要取决于程序的结构。如果启动计时器后代码中没有其他任何操作,主线程和扩展程序将退出整个程序。但是,通过无限超时睡眠,我们可以防止这种情况发生。
  5. 如果你确定这个,延迟执行代码,就是你想要的,那么我提供的解决方案应该可以很好地工作。但是我担心这可能是一个XY problem,这意味着这是你想出的另一个可以更好地解决的问题的解决方案。所以我不得不问,为什么你在服务中需要这个呢?