【问题标题】:How to execute a method everyday morning in c# .net如何在 C# .net 中每天早上执行一个方法
【发布时间】:2015-12-27 14:59:21
【问题描述】:

我想写一个代码来触发一个方法Processmethod每天早上06:00,不知何故我设法编写了以下代码,但它不是通用的。如何使用更少的代码让它在早上 6:00 开始?

while(true) {
    Thread.sleep(Timespan.FromHours(11))
    Processmethod();
}

【问题讨论】:

标签: c# multithreading .net-4.0 console-application


【解决方案1】:

您必须为此实施调度程序任务。有许多 dll 可用于执行此任务。例如,您可以使用 Quartz.Net。首先创建一个要执行的作业-

 public class EmailJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
       // implement your method here

    }
}

现在将此作业指定给调度程序 -

   public class JobScheduler
{
    public static void Start()
    {
        IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
        scheduler.Start();

        IJobDetail job = JobBuilder.Create<EmailJob>().Build();

        ITrigger trigger = TriggerBuilder.Create()
            .WithDailyTimeIntervalSchedule
              (s =>
                 s.WithIntervalInHours(24)
                .OnEveryDay()
                .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
              )
            .Build();

        scheduler.ScheduleJob(job, trigger);
    }
}

现在在 global.asax 的 Application_Start 中指定 JobScheduler.Start();

【讨论】:

  • 我使用 windows sheduler 来执行此操作,但主要问题是有时它会使中间 exe 处于打开状态。我需要像我所做的那样简单的方法
  • @peter 你不应该为此使用 Thread.sleep。因为它使线程在这段时间内保持阻塞,并将您的资源分配给该线程,这可能对您的应用程序非常有害。其次,您可以指定线程休眠的持续时间而不是特定的时间戳。
  • 我会创建一个窗口服务会用到的逻辑
【解决方案2】:

你可以试试下面的代码

while(true)
{
    if(DateTime.Now.Hour == 6 && DateTime.Now.Minute == 0)
       Processmethod();
    else
       Thread.Sleep(1000)
}

【讨论】:

  • 只有 Thread.Sleep(1000)?我想我必须做到 24 小时间隔
  • 我的建议是它会休眠一秒钟(1000 毫秒),然后检查条件以查看是否是早上 06:00。一旦它变成上午 06:00,该函数将被调用。我认为这比让它睡 24 小时更有意义,因为如果你调用 sleep(24 hours) 你可能会错过早上 06:00。除非您一直调用 sleep 直到它变成 6 ,否则执行该函数然后调用 sleep 24 小时。我对你有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2010-10-29
  • 2018-08-09
  • 2020-10-11
  • 1970-01-01
相关资源
最近更新 更多