有必要按计划执行某些操作,一个抽象的例子:
- 周一中午 12:00 从文件夹中取出文件
- 星期二13:39创建一个包含文件的文件夹
- 第三个周五7:03统计文件数量
为此使用每分钟timers并检查其中的时间和星期几是否有意义?IntervalTick
private void timer1_Tick(object sender, EventArgs e)
{
var currentTime = DateTime.Now.TimeOfDay;
var currentDow = DateTime.Now.DayOfWeek;
var oneMinute = new TimeSpan(0, 1, 0);
if ((currentDow == DayOfWeek.Monday)&&(currentTime-timeMonday<oneMinute))
{
MondayOperation();
}
if ((currentDow == DayOfWeek.Tuesday)&&(currentTime-timeTuesday<oneMinute))
{
TuesdayOperation();
}
if ((currentDow == DayOfWeek.Friday)&&(MyDoWInMonth(DateTime.Now).Equals(3))&(currentTime-timeFriday<oneMinute))
{
FridayOperation();
}
}
不,这绝对不够。Windows 不保证您的计时器实际上每分钟都会被调用。通过这样的比较,您很容易错过正确的时间或工作两次。
存储每个任务的下一个开始时间并在当前时间大于预定时间(但未超出某个合理间隔)时运行任务会更正确。原则上忘记严格的时间比较!
PS 供参考 - 我的旧相关答案:https ://ru.stackoverflow.com/a/593736/178779
最好使用Quartz.net库,它是专门为此目的而设计的,并且非常可配置。它也可以在 nuget 中使用:
Install-Package Quartz或者您通常可以使用 Windows 任务计划程序工具。
Hangfire - .NET 的任务计划程序
在我看来,这是最好的多线程和可扩展的任务调度程序。使用 NuGet 轻松安装
盒子里有一个漂亮的仪表板,其中包含所有统计信息和所有计划任务。
关于habrahabr的简要概述
我会将程序分成 3 个模块并使用标准的 Windows 任务计划程序。测试会更方便 + 始终清楚哪个组件无法正常工作
你可以把目光移开
TopShelf+Quartz,非常方便 + 拥有你需要的一切(DI 模块,任何规划)。为此,您需要分离工作(创建派生自 的类
IJob),然后像这样描述调度机制:然后像这样启动服务/控制台:
PS代码示例是指示性的,要解决您的问题,您需要编写自己的调度逻辑。