如何在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();
}
}
答
也许你必须要在石英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();
}
你是什么意思它在后台运行?你正在采取线程转储,并看到石英线程池仍然可用? – Srinivas
我的意思是当运行线程的方法永不结束,如果我关闭应用程序(btw wpf)它仍然只运行我可以杀死它在任务管理器。 – tpbafk
你想要达到什么目标并不十分清楚。如果你只想调用一个方法4次,为什么不使用一个简单的循环?在运行后立即调用一个工作,然后停止调度程序,在我看来是没有意义的。顺便说一句。你在代码中调用'sched.Start();'2次。请澄清你想达到的目标。 – Rabban