C# System.Threading.Timer尝试为每天相同的时间设置计时器

C# System.Threading.Timer尝试为每天相同的时间设置计时器,c#,multithreading,timer,C#,Multithreading,Timer,我正在控制台服务应用程序中使用System.Threading.Timer,并尝试为每天相同的时间设置计时器 如果我在开始之前就启动了应用程序,那么一开始我是很好的。比如,如果我的时间是10:05,我在10:00启动应用程序,我们就好了。但是如果我在10:06开始,我不知道如何告诉时间跨度提前24小时 谢谢你的帮助 public void SetUpTimer(TimeSpan alertTime) { DateTime current = DateTime.Now; TimeS

我正在控制台服务应用程序中使用System.Threading.Timer,并尝试为每天相同的时间设置计时器

如果我在开始之前就启动了应用程序,那么一开始我是很好的。比如,如果我的时间是10:05,我在10:00启动应用程序,我们就好了。但是如果我在10:06开始,我不知道如何告诉时间跨度提前24小时

谢谢你的帮助

public void SetUpTimer(TimeSpan alertTime)
{
    DateTime current = DateTime.Now;
    TimeSpan timeToGo = alertTime - current.TimeOfDay;

    if (timeToGo < TimeSpan.Zero)
    {
        EventLog.WriteEntry("MyApp", "Timer Passed  " );

        return;//time already passed
    }

    timer = new System.Threading.Timer(x =>
    {
        EventLog.WriteEntry("MhyApp", "Timer Set  " + timeToGo);

        this.MethodRunsAt();
    },  null, timeToGo, System.Threading.Timeout.InfiniteTimeSpan);
}
公共无效设置计时器(TimeSpan alertTime)
{
DateTime current=DateTime.Now;
TimeSpan timeToGo=alertTime-current.TimeOfDay;
if(timeToGo
{
EventLog.WriteEntry(“MhyApp”,“Timer Set”+timeToGo);
这个.MethodRunsAt();
},null,timeToGo,System.Threading.Timeout.InfiniteTimeMespan);
}

我建议您使用cron表达式来解决此任务。例如,您可以使用Quartz.Net库(可通过nuget获得)

您的cron表达式将如下所示:

0 10 * * *    //“At 10:00”
它告诉我们行动将在每天“10:00”准确执行。或者,如果您愿意,您甚至可以在每周一和周三开始:

0 10 * * 1,3  //“At 10:00 on Monday and Wednesday.”
或者,如果要使其在某个时间范围内具有周期性:

0/2 10 * * 1,3  //“At every 2nd minute from 0 through 59 past hour 10 on Monday and Wednesday.”

这里有一种方法:

public void SetUpTimer(TimeSpan alertTime)
{
    DateTime targetDateTime = DateTime.Today.Add(alertTime);
    if (targetDateTime < DateTime.Now)
    {
        targetDateTime = targetDateTime.AddDays(1);
    }
    TimeSpan timeToGo = targetDateTime - DateTime.Now;
    timer = new System.Threading.Timer(x =>
    {
        EventLog.WriteEntry("MhyApp", "Timer Set  " + timeToGo);

        this.MethodRunsAt();
    }, null, timeToGo, System.Threading.Timeout.InfiniteTimeSpan);
}
公共无效设置计时器(TimeSpan alertTime)
{
DateTime targetDateTime=DateTime.Today.Add(alertTime);
if(targetDateTimeTimeSpan timeToGo=targetDateTime-DateTime.Now;
定时器=新系统.线程.定时器(x=>
{
EventLog.WriteEntry(“MhyApp”,“Timer Set”+timeToGo);
这个.MethodRunsAt();
},null,timeToGo,System.Threading.Timeout.InfiniteTimeMespan);
}

这很接近。我不能准确地使用它,因为你不能使用Timespan=DateTime。我写了一些额外的代码,让它运行,以确保它在接下来的24小时内启动。如果我工作的话,我会发布期末考试。感谢您的帮助您不能有Timespan=DateTime不确定您的意思…可能需要查看更多代码。让我知道进展如何。TimeSpan timeToGo=targetDateTime-DateTime.Now;我不能那样做。但我已经解决了,等着看它明天是否能正常触发。再次感谢您可以用
TimeSpan-timeToGo=targetDateTime.Subtract(DateTime.Now)替换它。这听起来像一个很棒的软件包,但我甚至不能编译示例。我把它弄乱了一段时间,但现在把它放在一边。谢谢你的建议。