2017-10-16 5 views
3

Comment puis-je arrêter mon travail dans quartz.net 2.6.1. Lorsque WithRepeatCount est terminé, il fonctionne toujours en arrière-plan même si je ferme l'application. Je veux dire que je veux courir scheduler.Shutdown() lorsque le compte est terminé.Comment arrêter un emploi quand « WithRepeatCount » fait en C#

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

Que voulez-vous dire par son fonctionnement dans le fond? Est-ce que vous prenez une décharge de fil et voyez la piscine de fil de quartz étant toujours disponible? – Srinivas

+0

Je veux dire quand la méthode qui exécute le thread ne se termine jamais et si je ferme l'application (btw wpf) il est toujours en cours d'exécution que je peux le tuer dans le gestionnaire de tâches. – tpbafk

+0

On ne sait pas vraiment ce que vous voulez accomplir. Si vous voulez seulement appeler une méthode 4 fois, pourquoi n'utilisez-vous pas une simple boucle? Appeler un travail à quelques reprises immédiatement après son exécution, puis arrêter le planificateur, n'a aucun sens à mon avis. Btw. vous appelez 'sched.Start();' 2 fois dans votre code. Veuillez clarifier ce que vous voulez accomplir. – Rabban

Répondre

1

Peut-être que vous avez à jeter un oeil à quartz listeners et comprendre comment obtenir le nombre:

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

Mettre en oeuvre votre propre auditeur:

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

merci ça a fonctionné pour moi – tpbafk

0

Si .WithIntervalInSeconds (1) .WithRepeatCount (4) signifie qu'il fonctionnera pendant 5 secondes, alors il continuera à fonctionner jusqu'à ce toujours sur backend.So si j'ajouter Thread.Sleep (4000); et sched.Shutdown();après sched.Start(); il fonctionnera 5 sec alors il sera fermé. Le code devrait être comme ceci;

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