Multithreading 多线程任务库,线程。计时器还是线程?

Multithreading 多线程任务库,线程。计时器还是线程?,multithreading,.net-4.0,scheduled-tasks,Multithreading,.net 4.0,Scheduled Tasks,您好,我们正在构建一个应用程序,可以注册计划任务 每个任务都有一个应该执行的时间间隔 每个任务都应该有一个超时 任务的数量可以是无限的,但在正常情况下大约为100 所以我们有一个需要间隔执行的任务列表,哪一个是最好的解决方案 我已经考虑过给每个任务分配计时器,当计时器过期时,工作将启动,另一个计时器会跟踪超时,因此如果达到超时,另一个计时器将停止线程 这感觉像是我们过度使用计时器?或者它能起作用吗 另一种解决方案是为每个任务使用计时器,但当时间流逝时,我们将任务放在一个队列上,该队列将由一些执行

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

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

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

我已经考虑过给每个任务分配计时器,当计时器过期时,工作将启动,另一个计时器会跟踪超时,因此如果达到超时,另一个计时器将停止线程

这感觉像是我们过度使用计时器?或者它能起作用吗

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

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

你应该去看看

Quartz.NET是一款功能齐全、开放的 源作业调度系统,可以 从最小的应用程序到大型应用程序都可以使用 扩展企业系统


我相信你自己需要实现超时的要求,但是所有需要安排任务的管道都可以用Sigul.net来处理。

< P>没有太多的信息,但是看起来你也可以考虑RX。 您可以将任务视为生成的事件,这些事件应该以某种方式组合(安排)。因此,您可以执行以下操作:

  • 生成可取消且可观察到的任务。生成可一次性的和您自己的计划程序-查看
  • 延迟可观察到的
    任务。延迟
  • 等待可观察到的任务。超时
  • 以任何更好的方式编写任务

再一次,您可以在上面指定的链接上查看更多内容。

我以前做过类似的工作,其中有许多套接字对象需要定期启动和超时。我使用了一个带有“OnStart”和“OnTimeout”事件的“TimedAction”类(socket类等由此派生),以及一个处理所有计时操作的线程。该线程维护了一个TimedAction实例列表,这些实例按所需下一个操作(增量队列)的滴答时间排序。通过将TimedAction对象排入线程输入队列,将其添加到列表中。线程在此输入队列上等待超时(这是Windows,所以管理队列的信号量句柄上的“WaitForSingleObject”)设置为列表中第一项的“需要下一个操作”勾号计数。如果队列等待超时,则调用列表中第一个项目的相关操作事件,并从列表中删除该项目-然后将通过新的“列表中的第一个项目”设置下一个队列等待,该项目将包含新的“最近的操作时间”。如果一个新的TimedAction到达队列,线程将计算其超时滴答时间(对象的GetTickCount+ms interval),并将其插入排序列表中的正确位置(是的,这有时意味着将大量对象向上移动以腾出空间)

超时处理程序线程调用的事件无法执行任何长时间的操作,以防止延迟处理其他超时。通常,事件处理程序会设置一些状态枚举,向某个同步对象发送信号,或将TimedAction排队到另一个P-C队列或IO完成端口

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

我计划做的一个增强是使用多个列表,并有一组有限的超时间隔。在我的系统中只使用了三个常量超时间隔,所以我可以使用三个列表,每个间隔一个。这意味着列表不需要显式排序——新的TimedActions将始终位于列表的末尾。这将消除对象在列表/s中间的昂贵插入。我从来没有抽出时间来做这件事,因为我的第一个设计工作得很好,我还有很多其他的bug需要修复:(

两件事:

注意32位滴答数滚动

您需要在队列超时块中创建一个循环-列表中可能有完全相同或接近相同的超时标记计数的项目。一旦队列超时发生,您需要从列表中删除并触发每个对象的事件,直到新计算的超时时间>0。我与此不符。两个具有相同超时标记的对象count位于列表的顶部。其中一个触发了其事件,但系统计时计数已移动,因此下一个对象的计算超时计时为-1:INFINITE!我的服务器停止正常工作并最终锁定:(

Rgds,
Martin

主题听起来像.net。如果需要,请删除标记。我再次删除了.net标记。如果OP不是在寻找一个.net解决方案,那只会给他一大堆无用的答案。@NPehrsson,请添加一些关于这是什么平台/语言的信息。看起来像是一个解决方案,我想知道它下面是如何工作的,是否适合拥有数千个任务。只有测试/原型设计才能判断它是否适合您。但是Rx基于TPL来处理并发性,因此它应该保证相当好的性能指标。