1

我正在开发一项 Windows 服务,该服务需要在调用其中一个 Web 服务时安排任务。在最坏的情况下,这可能每秒发生数百次。任务需要等待一段时间,一般是一两分钟,然后调用传递参数的方法。

我们尝试构建自己的调度程序类来做到这一点:

public void ScheduleTask<T>(TimeSpan delay, Action<T> task, T arg)
{
    Thread.Sleep(delay);
    threadPool.ExecuteAsync(task, arg);
}

但我们认为这不合适,因为理论上我们最终可能会有数百个线程池线程都在等待。我的印象是可用的线程池线程数量有限,这可能会锁定系统。

然后我转向 Quartz.NET 并在他们的功能页面上阅读:

作业类实例可以由 Quartz.NET 或应用程序的框架实例化。

他们教程的第 3 页上,调度程序创建了您的作业类(不是您)的实例,因此:

在作业类上定义数据成员是没有意义的,因为每次作业执行时它们的值都会被“清除”。

随意对我大喊大叫,但是我如何在 Job 类实例执行之前获得对它的引用,以便我可以在其上设置属性?

  • 该属性正在执行参数的工作,因此在作业执行后我对它不感兴趣。
  • 我还想尽量减少实现这一目标所需的对象数量,以保持我的代码简洁明了。
  • 最后,我非常不喜欢使用字典,因此更愿意避免使用 JobDataMap 对象。
4

1 回答 1

1

我不完全了解您的用例是什么以及为什么需要在作业上设置属性,但要回答您的问题:要在作业执行之前访问您的作业,您需要创建一个作业侦听器(实现 IJobListener) . 作业侦听器在作业执行之前被调用,因此您可以在此时设置一个属性。

一些链接: 关于作业监听器的文档

我在这里写了一篇博文,详细介绍了监听器的创建。

于 2010-11-02T23:10:37.450 回答