您好我们正在构建一个可以注册计划任务的应用程序。
每个任务都有一个应该执行的时间间隔 每个任务都应该超时 任务量可以是无限的,但在正常情况下大约为100。
所以我们有一个需要间隔执行的任务列表,这是最好的解决方案吗?
我已经看过给每个任务他们的计时器,当计时器过去时工作将开始,另一个计时器跟踪超时,所以如果达到超时,另一个计时器停止线程。
这感觉就像我们过度使用计时器一样?或者它可以工作吗?
另一个解决方案是为每个任务使用计时器,但是当时间流逝时,我们将任务放在一个队列上,该队列将被一些执行工作的线程读取?
我应该寻找其他任何好的解决方案吗?
答案 0 :(得分:3)
没有太多信息,但看起来你也可以考虑RX - check more at MSDN.com。
您可以将您的任务视为应该以某种方式组合(计划)的生成事件。所以你可以做到以下几点:
Observable.GenerateWithDisposable
和您自己的Scheduler
生成可取消的任务 - 请在Rx 101 Sample Observable.Delay
'Observable.Timeout
您可以再次查看指定的上述链接。
答案 1 :(得分:1)
您应该查看Quartz.NET。
Quartz.NET是一个功能齐全,开放的 可以的源作业调度系统 从最小的应用程序到大型应用程序 扩展企业系统。
我相信您需要自己实现超时要求,但Quartz.NET可以处理调度任务所需的所有管道。
答案 2 :(得分:1)
在有很多套接字对象需要定期启动和超时之前,我已经做过类似的事情。我使用了'TimedAction'类,其中包含'OnStart'和'OnTimeout'事件(从此派生的套接字类等),以及一个处理所有定时操作的线程。该线程维护了一个TimedAction实例列表,该列表按下一个所需操作的滴答时间排序(增量队列)。通过将它们排队到线程输入队列,将TimedAction对象添加到列表中。线程在此输入队列上等待超时(这是Windows,因此管理队列的信号量句柄上的'WaitForSingleObject'),设置为列表中第一项的“需要下一个操作”滴答计数。如果队列等待超时,则调用列表中第一个项目的相关操作事件,并从列表中删除该项目 - 然后下一个队列等待将由新的“列表中的第一个项目”设置,其中包含新的“最近的行动时间”。如果新的TimedAction到达队列,则线程计算其超时计时时间(GetTickCount +对象的ms间隔),并将其插入到正确位置的排序列表中(是的,这有时意味着移动了很多对象)在列表中腾出空间。)
超时处理程序线程调用的事件无法执行任何冗长的操作,以防止延迟处理其他超时。通常,事件处理程序会设置一些状态枚举,发送一些同步对象或将TimedAction排队到其他一些P-C队列或IO完成端口。
这有意义吗?它工作正常,以合理及时有效的方式在我的服务器中处理数千个定时操作。
我计划进行的一项改进是使用具有一组有限超时间隔的多个列表。在我的系统中只使用了三个const超时间隔,因此我可以使用三个列表,每个间隔一个。这意味着列表不需要显式排序 - 新的TimedActions总是会到达列表的末尾。这将消除在列表中间昂贵的对象插入。我从来没有这样做,因为我的第一个设计工作得很好,我还有很多其他错误需要修复:(
两件事:
注意32位tickCount翻转。
您需要在队列超时块中进行循环 - 列表中可能存在具有完全相同或接近相同的超时滴答计数的项目。一旦发生队列超时,您需要从列表中删除并触发每个对象的事件,直到新确定的超时时间> 0。我对这个犯规了。具有相等超时刻度计数的两个对象到达列表的头部。其中一个事件被触发,但系统滴答计数已经移动,因此下一个对象的计算超时时间为-1:INFINITE!我的服务器停止正常工作并最终被锁定:(
RGDS, 马丁