2011-07-06 81 views
2

嗨,我们正在构建一个可以注册计划任务的应用程序。多线程任务库,Threading.Timer或线程?

每个任务都有当它应该被执行 每个任务应该有一个超时 任务的数量可以是无限的,但一个时间间隔在正常情况下大约100。

所以我们需要在间隔执行的任务,这是最好的解决方案的一个列表?

我已经看过给每个任务的定时器,当定时器经过的工作将开始,所以如果达到超时其他计时器停止线程另一个计时器不断超时轨道。

这感觉就像我们正在过度使用计时器?或者它可以工作?

另一种解决方案是使用定时器为每个任务,但是当经过我们把任务上,将与一些线程执行工作要读取的队列中的时间?

我应该寻找的其他任何好的解决方案?

+0

主题听起来像.NET。如果需要删除标签。 – leppie

+0

我拆了再.NET标签。如果OP是不是找一个.NET的解决方案,它会给他一个无用的答案。@NPehrsson,请添加一些关于这是什么平台/语言的信息。 – jalf

+0

我已经添加.net-4标记 – NPehrsson

回答

3

没有太多的信息,但它看起来像你可以考虑RX以及 - check more at MSDN.com

您可以将您的任务视为生成的事件,应该以某种方式组合(预定)事件。所以,你可以做到以下几点:

  • 都会产生Observable.GenerateWithDisposable撤销的任务和自己Scheduler - 检查更多的在任何最好Rx 101 Sample
  • Observable.Delay
  • 延迟任务
  • 等待任务,'Observable.Timeout
  • 撰写任务方式

再次,你可以在上面的链接所指定的查询更多。

+0

似乎是一个解决方案,我想知道如何它可以在下面工作,如果它适合有成千上万的任务 – NPehrsson

+1

只有测试/原型能够判断它是否适合你,但是Rx是基于TPL来处理并发性的,所以它应该保证相当好的性能m etrics。 –

+0

我选择了Rx,它似乎对我们很好。 – NPehrsson

1

您应该检查出Quartz.NET

Quartz.NET是一个全功能的,开放源码 作业调度系统,可以 从最小的应用程序用于大型 规模的企业系统。

我相信你需要自己实现你的超时需求,但是所有安排任务所需的配置都可以通过Quartz.NET来处理。

1

我做了这样的事情,其中​​有很多是需要定期启动和超时socket对象之前。我使用了'OnStart'和'OnTimeout'事件的'TimedAction'类,(从中派生出的套接字类等),以及一个处理所有定时操作的线程。该线程维护了一个TimedAction实例的列表,该列表按照所需的下一个操作(delta队列)的tick时间排序。 TimedAction对象通过将它们排队到线程输入队列而被添加到列表中。线程在这个输入队列上等待超时(这是Windows,管理队列的信号量句柄上的'WaitForSingleObject'),设置为列表中第一个项目的'需要下一个操作'的滴答计数。如果队列等待超时,则调用列表中第一个项目的相关操作事件,并将项目从列表中移除 - 接下来的队列等待将由新的'列表中的第一个项目'设置,该项目将包含新的“最近的行动时间”。如果一个新的TimedAction到达队列中,线程计算出其超时标记时间(GetTickCount + ms间隔距离对象),并将其插入到正确位置的排序列表中(是的,这有时意味着移动很多对象上榜以腾出空间)。

由超时处理程序线程调用的事件不能采取任何冗长的操作,以防止延迟处理其他超时。通常情况下,事件处理程序会设置一些状态枚举,指示某个同步对象或将TimedAction排队到其他P-C队列或IO完成端口。

这有道理吗?它工作正常,以合理及时和有效的方式在我的服务器中处理数千个定时操作。

我打算做的一个增强功能是使用多个列表和一组有限的超时间隔。在我的系统中只有三个常量超时间隔,所以我可以使用三个列表,每个间隔一个。这意味着列表不需要显式排序 - 新的TimedActions总是会到列表的末尾。这样可以避免在列表中间插入昂贵的对象。我从来没有得到周围做这个作为我的第一个设计已经足够好了,我有很多其他错误修复:(

两件事情:

谨防32位计时单位计数侧翻

你需要一个循环在队列超时块中 - 列表中可能有完全相同或接近相同的超时计数值的项目。一旦发生队列超时,需要从列表中删除并触发每个对象的事件,直到新有一个超时滴答计数的对象到达了列表的头部,其中一个事件被触发,但系统滴答计数已经开始,所以计算出的超时时间tic k为下一个对象是-1:无限!我的服务器停止工作正常,并最终锁定了:(

RGDS, 马丁