C# - System.Timers.Timer的替代方案,用于在特定时间调用函数

Fáb*_*nes 19 c# timer scheduled-tasks

我想在特定时间调用我的C#应用​​程序上的特定函数.起初我想过使用a Timer (System.Time.Timer),但很快就无法使用了.为什么?

简单.Timer类需要一个Interval毫秒,但考虑到我可能希望执行该函数,让我们在一周内说,这意味着:

  • 7天= 168小时;
  • 168小时= 10,080分钟;
  • 10,080分钟= 604,800秒;
  • 604,800秒= 604,800,000毫秒;
  • 所以间隔为604,800,000;

现在让我们记住,Interval接受的数据类型是int,并且我们知道int范围从-2,147,483,648到2,147,483,647.

这使得Timer无用,不是在这种情况下,但是在超过25天的情况下,一旦我们无法设置Interval更大的2,147,483,647毫秒.


所以我需要一个解决方案,我可以指定何时应该调用该函数.像这样的东西:

solution.ExecuteAt = "30-04-2010 15:10:00";
solution.Function = "functionName";
solution.Start();
Run Code Online (Sandbox Code Playgroud)

因此,当系统时间到达"30-04-2010 15:10:00"时,该功能将在应用程序中执行.

怎样才能解决这个问题?


附加信息:这些功能将起什么作用?

  • 根据该信息获取气候信息:
  • 启动/关闭其他应用程序(大多数是基于控制台的);
  • 向这些控制台应用程序发送自定义命令;
  • 断电,重启,睡眠,休眠计算机;
  • 如果可能的话,安排BIOS启动计算机;

编辑:

这似乎是在Interval接受数据类型double,但是如果你设置的值越大,一个intInterval,并调用Start()它抛出一个异常[0, Int32.MaxValue].

编辑2:

JørnSchou -Rode建议使用Ncron来处理调度任务,起初看起来这似乎是一个很好的解决方案,但我想听听一些使用它的人.

Adr*_*ian 12

你的"Start()"方法应该产生一个以定义的间隔唤醒的线程,检查时间,如果你没有达到所需的时间,则回到睡眠状态.


Kla*_*sen 11

我建议你只编写一个程序来处理它的业务部分,然后在必要时使用Windows任务计划程序执行该程序.


Jør*_*ode 10

任务调度的一种方法,与klausbyskov提出的方法相似,就是在现有的.NET调度框架/库之上构建调度服务.与使用Windows任务计划程序相比,这具有以下优点:(a)允许在同一项目中定义多个作业,以及(b)将作业和调度逻辑"保持在一起" - 即不依赖于容易丢失的服务器设置系统升级/更换.

我知道有两个提供这种功能的开源项目:

  • " Quartz.NET是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统." 我自己从未实际使用过这个框架,但是通过研究网站,我得到了一个非常可靠的工具的印象,提供了许多很酷的功能.[quartz-net]Stackoverflow 上有标记的事实也可能表明它实际上是在野外使用的.

  • " NCron是一个轻量级的库,用于在.NET服务器平台上构建和部署预定的后台作业." 它没有Quartz.NET的一半多的功能,并且它在Stackoverflow上没有任何标签,但作者(你的确)认为它的低摩擦API使它更容易上手.

在NCron之上构建您的调度服务,您可以CleanupJob使用一行代码安排每周执行:

service.Weekly().Run<CleanupJob>();
Run Code Online (Sandbox Code Playgroud)

好吧,你需要大约三行锅炉板代码来实际将你的项目变成一个Windows服务,但是当我声称它可以用一行代码完成时听起来更令人印象深刻;)