【问题标题】:System.Threading.Timer trying to make timer for same time every daySystem.Threading.Timer 尝试每天为同一时间制作计时器
【发布时间】:2017-06-08 19:00:21
【问题描述】:

我在控制台服务应用程序中使用 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);
}

【问题讨论】:

    标签: c# multithreading timer


    【解决方案1】:

    我建议你使用 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.”
    

    【讨论】:

    • 这听起来像是一个很棒的包,但我什至无法编译示例。我把它弄乱了一段时间,但现在把它放在一边。感谢您的建议。
    【解决方案2】:

    这是一种方法:

    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 = DateTime。我写了一些额外的代码并让它运行以确保它在接下来的 24 小时内启动。如果我工作,我会发布决赛。感谢您的帮助
    • 你不能有 Timespan = DateTime 不确定你的意思是什么......可能需要查看更多代码。告诉我进展如何。
    • TimeSpan timeToGo = targetDateTime - DateTime.Now;不能那样做。但我已经解决了,等着看明天是否能正常触发。再次感谢
    • 您可以将其替换为TimeSpan timeToGo = targetDateTime.Subtract(DateTime.Now);
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    相关资源
    最近更新 更多