如何在 C# 中完成 'WithRepeatCount' 后停止作业

How to stop a job when 'WithRepeatCount' done in C#

如何停止我在 quartz.net 2.6.1 中的工作。当 WithRepeatCount 完成后,即使我关闭应用程序,它仍然是 运行ning 背景。我的意思是我想 运行 scheduler.Shutdown() 计数完成后。

private void Start_Click(object sender, RoutedEventArgs e)
{
    Trigger trigger = new Trigger();
    trigger.StartTrigger();
}

private void Stop_Click(object sender, RoutedEventArgs e)
{
    Trigger trigger = new Trigger();
    trigger.StopTrigger();
}

[DisallowConcurrentExecution]/**/
class Job : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        IsConnected.CheckConnection();
    }
}
class Trigger
{
    private IScheduler Start()
    {
        ISchedulerFactory schedFact = new StdSchedulerFactory();
        IScheduler sched = schedFact.GetScheduler();
        sched.Start();
        return sched;

    }
    private IScheduler Stop()
    {
        ISchedulerFactory schedFact = new StdSchedulerFactory();
        IScheduler sched = schedFact.GetScheduler();
        sched.Shutdown();
        return sched;
    }

    public void StartTrigger()
    {
        IScheduler sched = Start();
        IJobDetail Job = JobBuilder.Create<Job>().WithIdentity("Job", null).Build();
            ISimpleTrigger TriggerJob =
            (ISimpleTrigger)TriggerBuilder
            .Create()
            .WithIdentity("Job")
            .StartAt(DateTime.UtcNow)
            .WithSimpleSchedule(x => x
            .WithIntervalInSeconds(1)
            .WithRepeatCount(4)
            )
            .Build();
            sched.ScheduleJob(Job, TriggerJob);
            sched.Start();
    }
    public void StopTrigger()
    {
            IScheduler sched = Stop();
            sched.Shutdown();
    }
}

如果 .WithIntervalInSeconds(1) .WithRepeatCount(4) 意味着它会 运行 5 秒然后它仍然会 运行 直到永远在后台.所以如果我添加 Thread.Sleep(4000);和 sched.Shutdown(); 在 sched.Start(); 之后它将 运行 5 秒然后它将是 closed.The 代码应该是这样的 ;

  public void StartTrigger()
        {
            try
            {
                IScheduler sched = Start();
                IJobDetail Job = JobBuilder.Create<Job>().WithIdentity("Job", null).Build();
                ISimpleTrigger TriggerJob =
                                   (ISimpleTrigger)TriggerBuilder
                                   .Create()
                                   .WithIdentity("Job")
                                   .StartAt(DateTime.UtcNow)
                                   .WithSimpleSchedule(x => x
                                   .WithIntervalInSeconds(1)
                                   .RepeatForever()
                                   //.WithRepeatCount(4)
                                   .WithMisfireHandlingInstructionNextWithExistingCount())
                                   .Build();
                sched.ScheduleJob(Job, TriggerJob);
                sched.Start();
                Thread.Sleep(4T000);
                sched.Shutdown();
            }

也许你得看看石英 listeners 并弄清楚如何获得计数:

IScheduler sched = Start();
IJobDetail jobDetail = GetJobDetail();
var listener = new CountJobListener();
sched.ListenerManager.AddJobListener(listener, KeyMatcher<JobKey>.KeyEquals(jobDetail.Key));
sched.Start();

实现您自己的侦听器:

internal class CountJobListener : IJobListener
{
    public void JobToBeExecuted(IJobExecutionContext context)
    {
    }

    public void JobExecutionVetoed(IJobExecutionContext context)
    {
    }

    public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
    {
        if (GetCount() >= 4)
        {
            context.Scheduler.Shutdown();
        }
    }

    private int GetCount()
    {
        throw new NotImplementedException();
    }

    public string Name { get { return "CountJobListener"; } }
}