在c#中指定时间启动函数

本文关键字:启动 函数 定时间 | 更新日期: 2023-09-27 18:15:10

我正在做一个c# Winform应用程序,它会自动发送两种类型的电子邮件:

第一组邮件必须只在星期一(每周)上午9点发送,第二组邮件必须只在每月(每月)的第一天发送。

当前我正在做这个

if (day_event == "monday" && DateTime.Now.Hour.ToString() == heuresortiehebdo)
{
    //starting first group of mails
}                    
else if(DateTime.Now.Day==1 && DateTime.Now.Hour.ToString() == heuresortiemensuels)
{
     //starting 2nd group of mails
} 

(heuresortiehebdo和heuresortiemensuels是在APP.config文件中设置的变量,它是发送每组邮件的小时设置)

所以这个解决方案工作了1次,但目标是让应用程序打开,永远不会停止它,自动发送邮件时,它的时间和小时。我想过线程,但如何检查每一次,如果它是美好的一天和美好的时间?

在c#中指定时间启动函数

我建议在。net库中使用Quartz。它使用CRON表达式来创建自定义调度器。

http://www.quartz-scheduler.net/documentation/index.html

这是每个星期一上午9点执行的CRON:

0 0 9 ? * MON *

这是将在每个月的第一天中午执行的CRON:

0 0 12 1 1/1 ? *

我们可以在这里创建CRON表达式:http://www.cronmaker.com/

您可以这样做。这里我们使用计时器来执行程序的调度部分。您可以在windows服务中使用此功能以使程序更有效。但如果你不想这样,你仍然可以在你的winforms应用程序中使用它。

public class EmailScheduler : IDisposable
{
    private readonly Timer clock;
    public EmailScheduler()
    {
        clock = new Timer();
        clock.Interval = 1000; // runs every second just like a normal clock            
    }       
    public void Start()
    {
        clock.Elapsed += Clock_Elapsed;
        this.clock.Start();
    }
    public void Stop()
    {
        clock.Elapsed -= Clock_Elapsed;
        this.clock.Stop();
    }
    private void Clock_Elapsed(object sender, ElapsedEventArgs e)
    {
        var now = DateTime.Now;
        // Here we check 9:00.000 to 9:00.999 AM. Because clock runs every 1000ms, it should run the schedule
        if (now.DayOfWeek == DayOfWeek.Monday && 
            (now.TimeOfDay >= new TimeSpan(0, 9, 0, 0, 0) && now.TimeOfDay <= new TimeSpan(0, 9, 0, 0, 999)))
        {
            // 9 AM schedule
        }
        if(now.Date.Day == 1 &&
            (now.TimeOfDay >= new TimeSpan(0, 9, 0, 0, 0) && now.TimeOfDay <= new TimeSpan(0, 9, 0, 0, 999)))
        {
            // 1 day of the month at 9AM
        }
    }
    public void Dispose()
    {
        if (this.clock != null)
        {
            this.clock.Dispose();
        }
    }
}

要启动调度程序,您可以在表单中这样做。

   private EmailScheduler scheduler;
   public void FormLoad()
   {
       scheduler =  new EmailScheduler();
       scheduler.Start();
   }
   public void FormUnload()
   {
       scheduler.Stop();
       scheduler.Dispose();
   }

使用Windows任务调度程序自动执行。如果应用程序每天只做一件事30秒,那么就没有理由占用系统资源并让它持续运行。

现在,你有关于管理要发送的电子邮件的问题。有几个选项可以解决这个问题。

选项1是建立一个小的前端,执行必要的配置选项,存储在一些共享配置空间或数据库

选项2(也是我要做的)是让应用程序通常启动到接口模式,以允许配置工作,并手动发送电子邮件。但也要提供一个参数,该参数可以通过命令行(或计划任务的参数选项)传入,该参数根据最后保存的配置甚至是特定的配置(如果需要)发送电子邮件。