如何在C#中完成'WithRepeatCount'时停止工作

问题描述:

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

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(); 
    } 
} 
+0

你是什么意思它在后台运行?你正在采取线程转储,并看到石英线程池仍然可用? – Srinivas

+0

我的意思是当运行线程的方法永不结束,如果我关闭应用程序(btw wpf)它仍然只运行我可以杀死它在任务管理器。 – tpbafk

+0

你想要达到什么目标并不十分清楚。如果你只想调用一个方法4次,为什么不使用一个简单的循环?在运行后立即调用一个工作,然后停止调度程序,在我看来是没有意义的。顺便说一句。你在代码中调用'sched.Start();'2次。请澄清你想达到的目标。 – Rabban

也许你必须要在石英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"; } } 
} 
+1

谢谢你为我工作 – tpbafk

如果.WithIntervalInSeconds(1).WithRepeatCount(4)意味着它将运行5秒钟,则它仍将在backend.So运行直到永远如果我添加Thread.sleep代码(4000);和sched.Shutdown();after sched.Start();它会运行5秒,然后它将被关闭。代码应该是这样的;

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(); 
      }