如何检测 Quartz.net 中作业何时被取消?

How to detect when a job was canceled in Quartz.net?

我正在使用 Quartz.net 3.x,根据我能找到的关于该主题的少量文档,我实现了取消工作的功能,如下所示:

public class MyJob : IJob
  public async Task Execute(IJobExecutionContext context)
  {
      //Do some stuff...
      context.CancellationToken.ThrowIfCancellationRequested();
      //Do other stuff...
  }
}

这似乎工作正常,实际上如果取消作业,通过调用以下代码

scheduler.Interrupt(myJobKey);

作业在遇到下一条 ThrowIfCancellationRequested() 指令时停止。

但是,问题是我有一个 IJobListener,当作业完成时,需要检查作业是否被取消或是否正确完成。我试过这样实现它:

public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default(CancellationToken))
            {
    if(jobException != null && jobException.InnerException is OperationCanceledException){
        //doesn't work, when a OperationCanceledException was raised as a result of calling ThrowIfCancellationRequested() jobException is null 
    }

    if(cancellationToken.IsCancellationRequested){
        //doesn't work either, IsCancellationRequested is always false
    }
}

我在这里错过了什么?我目前有一个解决方法,我将作业上下文的 Result 属性 设置为一个自定义值,告诉我作业已被取消,但肯定有一个“正确”的方法来做到这一点?

我发现了问题:显然我应该是在作业的 Execute 方法中手动抛出 JobExecutionException 的人,当该方法抛出任何其他异常时,Quartz 不会自动这样做。或者,至少,它不会总是自动执行它,因为当我重新抛出其他异常类型时它正在执行...也许它只自动处理某些类型的异常?

我不知道,但这行得通:

public class MyJob : IJob
  public async Task Execute(IJobExecutionContext context)
  {
      //Do some stuff...
      try{
        context.CancellationToken.ThrowIfCancellationRequested();
      } 
      catch(OperationCanceledException ex){
        throw new JobExecutionException(ex);
      }
      //Do other stuff...
  }
}