【问题标题】:Run method after defined time on windows service在 Windows 服务上定义时间后运行方法
【发布时间】:2017-06-06 11:10:58
【问题描述】:

我的问题更多是关于到达同一个目的地,但必须有另一种方式。现在我正在创建一个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?
                }
            }
        }

【问题讨论】:

标签: c# .net windows-services


【解决方案1】:

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

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

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

我们在这里做的事情如下。

  1. 以 300000 毫秒的间隔实例化计时器
  2. 订阅计时器的Elapsed 事件,该事件在指定时间过后触发
  3. 启动计时器
  4. 永远沉睡我们的主线程。此行是可选的。是否需要它取决于程序的结构。如果在您启动计时器后您的代码中没有发生任何其他事情,则主线程以及整个程序将退出。但是,通过无限超时休眠,我们可以防止这种情况发生。

如果您确定延迟执行代码是您想要的,那么我提供的解决方案应该可以很好地工作。但是我担心这可能是XY problem,这意味着这是您针对不同问题提出的解决方案,可以更好地解决。所以我不得不问,为什么你的服务需要这个?

【讨论】:

  • Cody Gray 已经评论说 Windows 服务可能不是最好的方法。由于背后的代码及其工作原理,我只是想要一个预定的例程。我检查数据,将其与另一个实体进行比较,并可能编写一个数据库条目。该例程不需要在每次例程完成之前触发,此外,我们不知道要检查的数据库条目会增长多大,我们可能希望将检查时间更改为另一个值。对于我正在执行的操作,计划任务就像这样是强制性的。
  • 另外:我使用System.Threading 参考并且像你的代码一样我得到了标记,计时器的构造函数无法处理“300000”或者不知道Elapsed ...
  • 这个计时器来自System.Timers 命名空间。 System.Threading.Timer 类是不同的。我建议使用System.Timers.Timer,因为除其他外。替代方案不是开箱即用的线程安全。可以找到综合对比here
  • 声称System.Threading.Timer 不是线程安全的完全是无稽之谈。它不会为您处理同步,但这应该是显而易见的。编写线程安全代码是你的工作。根据允许您得出结论的标准 System.Threading.Timer 不是线程安全的,System.Threading.Thread 也不是线程安全的。 These timer classes are perfectly thread-safe。它们在功能上是等效的。事实上,一个是根据另一个来实现的。
【解决方案2】:

使用 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) {

}

【讨论】:

  • 也许给我一些例子,它是如何工作的?总是期望提问的人不会总是现在你在这里做什么?例如,他可能不知道您正在订阅自定义事件。还要解释你的解决方案。以 Sty 的回答为例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多