在C#

时间:2016-10-27 12:43:21

标签: c# multithreading

我正在做一个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文件设置的变量,它是发送每组邮件的小时数)

所以这个解决方案可以工作一次,但目标是让应用程序打开并永不停止,自动发送邮件的时间和时间。我已经考虑了线程,但如果是好日子和好时光,如何检查?不使用Windows任务调度程序。

2 个答案:

答案 0 :(得分:1)

我建议使用Quartz for .NET库。它需要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/

答案 1 :(得分:0)

你可以这样做。这里我们使用计时器来执行程序的调度部分。您可以在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();
   }