安排一个C#Windows服务每天执行一项任务

安排一个C#Windows服务每天执行一项任务,c#,windows-services,scheduled-tasks,C#,Windows Services,Scheduled Tasks,我找到了,我试着去做,但在我开始服务的时候,它并没有给我带来任何工作。有一件事我不明白:“计时器=新计时器(10*60*1000);//每10分钟 我想每天晚上10:00进行服务,我该怎么做 即使计时器在您引用的答案中每十分钟轮询一次-它每天只处理一次: private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { // ignore the time, just compare the dat

我找到了,我试着去做,但在我开始服务的时候,它并没有给我带来任何工作。有一件事我不明白:“计时器=新计时器(10*60*1000);//每10分钟


我想每天晚上10:00进行服务,我该怎么做

即使计时器在您引用的答案中每十分钟轮询一次-它每天只处理一次:

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // ignore the time, just compare the date
    if (_lastRun.Date < DateTime.Now.Date)
    {
private void timer\u已过(对象发送方,System.Timers.ElapsedEventArgs e)
{
//忽略时间,只比较日期
如果(_lastRun.Date
要使其在上午10:00发生,请添加另一个条件,例如:

_lastRun.Date和&DateTime.Now.Hour=10

十分钟是用作轮询频率的时间


Windows有一个内置的任务调度器,可以更好地满足任何调度需求。在处理调度任务时,可能会出现很多问题,例如系统重新启动、日光节约

您可以参考Ayende的博客,了解制作自己的调度程序的一些错误问题。

您可以使用Quartz.NET来托管服务,而不是滚动您自己的计时器。它运行良好,并具有一些附加功能,如追赶(如果您需要)以及农场服务功能


您可以找出
当前时间
和您的
所需计划时间
之间的
差异
,并相应地设置时间间隔。这样,计时器
事件将在计划时间触发一次
。将时间间隔设置为24小时

private System.Timers.Timer _timer;    

private void SetTimer()
{
    DateTime currentTime = DateTime.Now;
    int intervalToElapse = 0;
    DateTime scheduleTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 10,0,0);

    if (currentTime <= scheduleTime)
        intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds;
    else
        intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds;

    _timer = new System.Timers.Timer(intervalToElapse);

    _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
    _timer.Start();
}

void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
       //do your work
       _timer.Interval = (24 * 60 * 60 * 1000);
}
private System.Timers.Timer\u Timer;
私有void SetTimer()
{
DateTime currentTime=DateTime.Now;
int intervaltoeferse=0;
DateTime scheduleTime=新的日期时间(currentTime.Year,currentTime.Month,currentTime.Day,10,0,0);

如果(currentTime那么你能告诉我,这10分钟意味着什么吗?谢谢。请查看我的编辑。如果你想让代码在计划任务上运行它,只需要有一个exe,当你使用命令行参数启动时,它会运行进程,但如果你双击exe,它会向你显示如何在无人参与的情况下运行它的说明-这种方式当人们想知道程序的功能时,不会意外地启动进程。根据您试图运行的程序,最好将其构建为控制台应用程序,并让Windows任务计划程序在您需要时运行。@您无法接受Adil
answer?这也是一个很好的解决方案。:)因为此问题属于未回答类别。+1您的问题和
Adil
答案。有帮助:)))),嗯-这听起来不错,但我看了一下页面,它没有太多信息,你有代码示例吗?编辑-我必须在
OnStart
中使用
SetTimer
方法吗?你可以随时调用它,但调用OnStart将确保它不会错过计划任务。例如,你的服务在9:58启动,然后它就可以运行了必须调用,以便将计时器在10TotalSeconds时经过的事件替换为TotalMillicles,因为计时器接受的值为毫秒而不是秒。