多线程任务库,Threading.Timer或线程?

时间:2011-07-06 08:32:26

标签: multithreading .net-4.0 scheduled-tasks

您好我们正在构建一个可以注册计划任务的应用程序。

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

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

我已经看过给每个任务他们的计时器,当计时器过去时工作将开始,另一个计时器跟踪超时,所以如果达到超时,另一个计时器停止线程。

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

另一个解决方案是为每个任务使用计时器,但是当时间流逝时,我们将任务放在一个队列上,该队列将被一些执行工作的线程读取?

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

3 个答案:

答案 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, 马丁