我用的是Quartz。网络图书馆。我写了一些触发器:
var t =
TriggerBuilder.Create()
.WithIdentity("FirstTask", "TaskGroup")
.StartAt(DateBuilder.TodayAt(16, 17, 0))
.EndAt(DateBuilder.TodayAt(17, 17, 0))
.WithSimpleSchedule(x => x.RepeatForever()
.WithIntervalInSeconds(1))
.Build();
如果我排除.WithIntervalInSeconds(1)
,我有一个异常,重试时间不能为零。那么,当我的工作完成后,我如何重新启动它呢?另外,我没有找到quartz.net配置文件来为它设置最大线程数
设置最大线程数为50:
var properties = new NameValueCollection { { @"quartz.threadPool.threadCount", @"50" } };
var factory = new StdSchedulerFactory(properties);
var scheduler = schedulerFactory.GetScheduler();
并且不排除WithIntervalInSeconds
, Quartz必须知道,何时再次运行
在我之前的工作中,我们将Quartz threadpool
配置为如下:
quartz.threadPool.threadCount = 3
详细信息请参见配置部分
@stuartd在这里提供您的问题的答案。
接受他的回答,然后改变触发器使用StartNow
方法:
var trigger = TriggerBuilder.Create()
.WithIdentity(triggerKey)
.startNow()
.build();
@SchlaWiener也提供了一个使用TopShelf
的很好的解决方案。
比一开始看起来容易多了:
var job = JobBuilder.Create<HelloJob>().WithIdentity(new JobKey("Task_1", "TaskGroup")).Build();
var t = TriggerBuilder.Create()
.WithIdentity("Trigger_1", "TaskGroup")
.StartAt(DateBuilder.TodayAt(21, 15, 0))
.EndAt(DateBuilder.TodayAt(21, 18, 0))
.Build();
_scheduleService.Scheduler.ScheduleJob(job, t);
和在listener中的实现方法:
public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
{
if (DateTime.UtcNow > context.Trigger.EndTimeUtc)
return;
context.Scheduler.RescheduleJob(context.Trigger.Key, context.Trigger);
}