2017-10-16 4 views
3

Wie kann ich meinen Job in Quartz.net stoppen 2.6.1. Wenn WithRepeatCount fertig ist, läuft noch der Hintergrund, selbst wenn ich die Anwendung schließe. Ich meine, ich möchte scheduler.Shutdown() ausführen, wenn die Zählung abgeschlossen ist.Wie man einen Job stoppt, wenn 'WithRepeatCount' in C getan wird

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

Was meinen Sie läuft es im Hintergrund? Nehmen Sie einen Thread-Dump und sehen, dass der Quarz-Thread-Pool noch verfügbar ist? – Srinivas

+0

Ich meine, wenn die Methode den Thread nie endend läuft und wenn ich die Anwendung (BTW WPF) schließe läuft es nur ich kann es im Task-Manager töten. – tpbafk

+0

Es ist nicht wirklich klar, was Sie erreichen möchten. Wenn Sie nur viermal eine Methode aufrufen möchten, warum verwenden Sie dann nicht einfach eine einfache Schleife? Einen Job ein paar Mal direkt nach seinem Lauf anzurufen und dann den Scheduler anzuhalten, macht meiner Meinung nach keinen Sinn. Übrigens. Sie rufen 'sched.Start();' 2 mal in Ihrem Code auf. Bitte erläutern Sie, was Sie erreichen möchten. – Rabban

Antwort

1

Vielleicht muss man in Quarz listeners einen Blick darauf werfen und es herauszufinden, wie die Zählung zu erhalten:

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

Implementieren Sie Ihre eigenen Hörer:

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

danke, dass es für mich funktioniert hat – tpbafk

0

Wenn .WithIntervalInSeconds (1) .WithRepeatCount (4) bedeutet es für 5 Sekunden ausgeführt wird, dann wird es nach wie vor, bis immer auf backend.So laufen, wenn i Thread.Sleep (4000) hinzuzufügen; und sched.Shutdown();nach sched.Start(); wird es 5 Sekunden laufen, dann wird es geschlossen sein. Der Code sollte so sein;

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