C# 如何在Quartz.net的中断方法中访问IJobexecutionContext?

C# 如何在Quartz.net的中断方法中访问IJobexecutionContext?,c#,quartz-scheduler,quartz.net,C#,Quartz Scheduler,Quartz.net,我目前正在开发基于Quartz.net的job manager。我希望能够实时显示作业执行状态,以便在发出作业中断请求时保存context.jobdail.JobDataMap.Put(“状态”、“中断”)并通过获取调度程序中当前正在执行的所有作业来读取此状态。但是,问题是,我无法在Interrupt()方法中直接访问IJobExecutionContext上下文对象,因此我无法在请求中断时立即设置中断状态。这是我基本上想要实现的功能: class InterruptedException :

我目前正在开发基于
Quartz.net
的job manager。我希望能够实时显示作业执行状态,以便在发出作业中断请求时保存
context.jobdail.JobDataMap.Put(“状态”、“中断”)并通过获取调度程序中当前正在执行的所有作业来读取此状态。但是,问题是,我无法在
Interrupt()
方法中直接访问
IJobExecutionContext
上下文对象,因此我无法在请求中断时立即设置中断状态。这是我基本上想要实现的功能:

class InterruptedException : Exception { }

[PersistJobDataAfterExecution, DisallowConcurrentExecution]
class MyJob : IInterruptableJob
{
    private bool _interrupted;
    private void AssertContinue()
    {
        if (_interrupted) throw new InterruptedException();
    }

    public void Execute(IJobExecutionContext context)
    {
        try
        {
            context.JobDetail.JobDataMap.Put("status", "started");
            AssertContinue();

            // Do the work
            AssertContinue();

            context.JobDetail.JobDataMap.Put("status", "completed");
        }
        catch (InterruptedException)
        {
            // Set interrupted status when job is actually interrupted
            context.JobDetail.JobDataMap.Put("status", "interrupted");
        }
        catch
        {
            // log any othe errors but set interrupted status only on InterruptedException
        }
    }

    public void Interrupt()
    {
        _interrupted = true;

        // I want to set interrupting statues here!!!
        context.JobDetail.JobDataMap.Put("status", "interrupting");
    }
}

据我所知,
IInterruptableJob
接口实现的基本思想是在
void Interrupt()
方法内将一些
\u interrupted
标志值设置为
true
,然后在
Execute()
方法中的每个执行步骤上检查该标志值。因此,基本上,我们不能立即中断作业,我们可以发出中断请求,并且只有在执行中断状态检查时,我们才能通过抛出异常来中断作业。但是我想在这段短时间内为我的工作设置中断状态。我该怎么做?甚至可以在
Interrupt()
方法中获取
iObjExecutionContext上下文
对象吗?

好吧,解决方案非常简单明了。我只需要创造一个私人空间

IJobExecutionContext\u context=null

字段,并在
Execute()
方法中将其值设置为
context

public void Execute(IJobExecutionContext context) 
{
    _context = context;
    ...
}
基本上,我们只能中断正在执行的作业,因此如果调用了
interrupt()
,则至少调用了一次
Execute()
,因此这种方法基本上适合我的需要,并在调用
interrupt
后立即更新作业的
DataMap