用了Quartz.NET,发现如果有任务正在运行,程序是不能完全关掉的。因为有任务线程还在运行。研究了一下,发现有如下方法:
1、将任务线程改为后台线程。严格来说这个不能算是“终止正在运行的任务”。
方法是:在Execute(IJobExecutionContext context)里加入Thread.CurrentThread.IsBackground = true;
2、声明任务类时使用IInterruptableJob,然后在需要的时候通过IScheduler.GetCurrentlyExecutingJob s()取到所有正在运行的任务并Interrupt之。
这里又有两个办法,一个是在Execute(IJobExecutionContext context)里保存Thread.CurrentThread的一个引用,在Interrupt()里面Abort. 另外一个是在Interrupt()里设置一个跨线程变量,在Execute(IJobExecutionContext context)里检查其值并适时return.
前一个方法比较暴力点,一般推荐后一种方法。但是如果正好碰上Sleep,那就只有Abort可以奏效。
1、将任务线程改为后台线程。严格来说这个不能算是“终止正在运行的任务”。
方法是:在Execute(IJobExecutionContext context)里加入Thread.CurrentThread.IsBackground = true;
2、声明任务类时使用IInterruptableJob,然后在需要的时候通过IScheduler.GetCurrentlyExecutingJob
这里又有两个办法,一个是在Execute(IJobExecutionContext context)里保存Thread.CurrentThread的一个引用,在Interrupt()里面Abort. 另外一个是在Interrupt()里设置一个跨线程变量,在Execute(IJobExecutionContext context)里检查其值并适时return.
前一个方法比较暴力点,一般推荐后一种方法。但是如果正好碰上Sleep,那就只有Abort可以奏效。
