10

我刚刚将quartz.net dll 添加到我的bin 并开始了我的示例。如何根据时间使用quartz.net 调用C# 方法?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Quartz;
using System.IO;


public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(SendMail())
             Response.write("Mail Sent Successfully");
    }
   public bool SendMail()
   {
    try
    {
        MailMessage mail = new MailMessage();
        mail.To = "test@test.com";
        mail.From = "sample@sample.com";
        mail.Subject = "Hai Test Web Mail";
        mail.BodyFormat = MailFormat.Html;
        mail.Body = "Hai Test Web Service";
        SmtpMail.SmtpServer = "smtp.gmail.com";
        mail.Fields.Clear();
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "redwolf@gmail.com");
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "************");
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
        SmtpMail.Send(mail);
        return (true);
    }
    catch (Exception err)
    {
        throw err;
    }
}
}

在这里,我只是在页面加载时发送邮件。如何SendMail()使用quartz.net 在一天中的给定时间(比如早上6 点)打一次电话?我不知道如何开始。我应该在我的global.asax文件中配置它吗?有什么建议吗?

4

4 回答 4

24

你试过quartz.net 教程吗?

由于您的 Web 应用程序可能会被回收/重新启动,您可能应该(重新)初始化 global.asax.cs 中 Application_Start 处理程序中的 quartz.net 调度程序。


更新(带有完整示例和其他一些注意事项):

这是一个完整的例子,如何使用quartz.net 做到这一点。首先,您必须创建一个实现IJobquartz.net 定义的接口的类。此类由quartz.net 调度程序在配置的时间调用,因此应包含您的发送邮件功能:

using Quartz;
public class SendMailJob : IJob
{
    public void Execute(JobExecutionContext context)
    {
        SendMail();
    }
    private void SendMail()
    {
        // put your send mail logic here
    }
}

接下来,您必须初始化quartz.net 调度程序以在每天06:00 调用您的作业一次。这可以通过以下方式Application_Start完成global.asax

using Quartz;
using Quartz.Impl;

public class Global : System.Web.HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        ISchedulerFactory schedFact = new StdSchedulerFactory();
        // get a scheduler
        IScheduler sched = schedFact.GetScheduler();
        sched.Start();
        // construct job info
        JobDetail jobDetail = new JobDetail("mySendMailJob", typeof(SendMailJob));
        // fire every day at 06:00
        Trigger trigger = TriggerUtils.MakeDailyTrigger(06, 00);
        trigger.Name = "mySendMailTrigger";
        // schedule the job for execution
        sched.ScheduleJob(jobDetail, trigger);
    }
    ...
}

就是这样。您的工作应在每天 06:00 执行。对于测试,您可以创建一个每分钟触发一次的触发器(例如)。看看方法TriggerUtils

虽然上述解决方案可能对您有用,但您应该考虑一件事:如果一段时间内没有活动(即没有活动用户),您的 Web 应用程序将被回收/停止。这意味着您的发送邮件功能可能不会被执行(仅当在应该发送邮件的时间有一些活动时)。

因此,您应该考虑针对您的问题的其他解决方案:

  • 您可能想要实现一个 Windows 服务来发送您的电子邮件(Windows 服务将始终运行)
  • 或者更简单:在一个小型控制台应用程序中实现您的发送邮件功能,并在 Windows 中设置一个计划任务,以便在需要的时间每天调用一次您的控制台应用程序。
于 2010-07-14T12:24:48.973 回答
2

除了提供的好答案 M4N 之外,您还可以查看quartz.net lib 的 spring.net 集成,它允许在无需实现 IJob 的情况下调用方法。

于 2010-07-19T22:22:18.517 回答
2

在 schedFact.GetScheduler() 的末尾添加 .Result;

void Application_Start(object sender, EventArgs e)
        {
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            // get a scheduler
            IScheduler sched = schedFact.GetScheduler().Result;
            sched.Start();
            // construct job info
            JobDetail jobDetail = new JobDetail("mySendMailJob", typeof(SendMailJob));
            // fire every`enter code here` day at 06:00
            Trigger trigger = TriggerUtils.MakeDailyTrigger(06, 00);
            trigger.Name = "mySendMailTrigger";
            // schedule the job for execution
            sched.ScheduleJob(jobDetail, trigger);
        }
于 2020-02-12T13:52:48.603 回答
-3

我在寻找石英。我这样做是为了我的工作:

1:从可视控制台安装 Quartz:

PM> Install-Package quartz

2:创建一个这样的类:

using Quartz;
public class Quartz : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        //do some 
    }
}

3.在全球范围内

using Quartz;
using Quartz.Impl;

    protected void Application_Start(object sender, EventArgs e)
    {
        //for start time at first run after 1 hour
        DateTimeOffset startTime = DateBuilder.FutureDate(1, IntervalUnit.Hour);
        IJobDetail job = JobBuilder.Create<Quartz>()
                                   .WithIdentity("job1")
                                   .Build();
        ITrigger trigger = TriggerBuilder.Create()
                                         .WithIdentity("trigger1")
                                         .StartAt(startTime)
                                         .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(2))
                                         .Build();
        ISchedulerFactory sf = new StdSchedulerFactory();
        IScheduler sc = sf.GetScheduler();
        sc.ScheduleJob(job, trigger);
        sc.Start();
    }

它是每 10 秒做一些工作 3 次的代码。祝你好运

于 2014-08-04T08:19:19.097 回答