如何设置Quartz.NET线程池中的线程数?

Sla*_*uma 9 .net quartz.net

我在Quartz.NET文档的这个教程部分看到,应该可以定义Quartz调度程序将使用的最大线程数.在我的特殊情况下,我想将此数字设置为1.但是在API文档中,我找不到一种方法来访问我的调度程序正在使用的线程池实例并在其上设置任何属性.

目前我的代码如下所示:

ISchedulerFactory schedFact = new StdSchedulerFactory();

IScheduler scheduler = schedFact.GetScheduler();
scheduler.Start();

// Setup jobs and triggers and then call scheduler.ScheduleJob...
Run Code Online (Sandbox Code Playgroud)

有人知道如何设置池中的线程数吗?

提前感谢您的帮助!

Sco*_*rch 28

如果您不想quartz.config因任何原因依赖外部文件,可以使用下面的代码以编程方式执行此操作:

    var properties = new NameValueCollection { {"quartz.threadPool.threadCount", "1"} };

    var schedulerFactory = new StdSchedulerFactory(properties);
    var scheduler = schedulerFactory.GetScheduler();
Run Code Online (Sandbox Code Playgroud)

我同意接受的答案中的评论,但在这种情况下,您可能希望[DisallowConcurrentExecutionAttribute]在您的IJob课程中使用.

  • 我已经这样做了,但是当我的 IJob 类没有 `[DisallowConcurrentExecutionAttribute]` 并且我在工作中使用睡眠时,就像 [这个示例](http://pastebin.com/kzyJYqaj) 一样,您会多次看到 `int a`在第一份工作结束之前。这是因为当我的线程进入睡眠状态时,它开始执行另一项计划的工作(**这里仍然只有一个线程**)。这是我一开始不明白的事情,虽然我可能会帮助其他人,所以我在这里留下这个评论:D (2认同)

jde*_*per 4

这在一定程度上取决于您正在使用的池以及调度程序正在读取的配置文件。但如果您使用标准SimpleThreadPool.cs,则可以在quartz.config 文件中配置线程数量,默认情况下会创建 10 个线程:

替代文本

  • @Slauma:Quartz.Net 2.x 的方法是用“[DisallowConcurrentExecutionAttribute]”装饰实现“IJob”的类 (8认同)
  • 与此同时,我为我的目的找到了另一种解决方案:我只有一个带有许多参数化触发器的 JobDetail,并且将 ThreadCount 设置为 1 我想确保作业不会同时运行。(我的 Execute 方法不是线程安全的。)但更直接的方法似乎是实现“IStatefulJob”而不是我现在所做的 IJob(似乎按我想要的方式工作)。不管怎样:你肯定回答了我的问题,并且很高兴知道有一个配置文件(直到现在我才知道)以及我可以用它做什么。谢谢你! (3认同)