【问题标题】:What is the best way to delay thread starts until a specific time?将线程启动延迟到特定时间的最佳方法是什么?
【发布时间】:2010-01-05 03:20:27
【问题描述】:

我正在构建一个需要在特定时间调用某个 API 的应用程序。我想为每个调用设置执行时间,并在每次调用需要执行时自动调用我的执行函数。最好的方法是什么?

我曾考虑为每个需要执行的新调用创建一个新计时器,并将计时器的唯一间隔设置为其执行时间。这是实现我需要的好方法还是有更有效的方法?

【问题讨论】:

    标签: c# multithreading scheduling timer


    【解决方案1】:

    对于少数定时器/线程来说,这是一种合理的方法。对于较大的数字,您将使用一个设置为间隔的最大公分母的计时器,并让它选择适当的任务(如果有)来启动。

    使用 Windows 计划任务几乎肯定是矫枉过正。

    【讨论】:

    • 我同意调度任务的单个计时器。如果您需要在特定时间(例如分钟的开头)启动,那么您的计时器间隔需要足够小,以便在您的分辨率要求内(例如在一秒内)检测到分钟的变化。
    【解决方案2】:

    我喜欢将单个线程(或线程池线程)与 ResetEvent(手动或自动)一起使用,并将超时设置为最快任务的一部分(例如每 5 秒一次)。在外部,您可以调用事件来处理待处理的调度,或者每次超时时,您也可以检查待处理的调度。

    如果您将超时设置为最小间隔的一小部分(例如 30%),那么您可以很好地控制“检查”过程所花费的时间,但如果您错过了一个间隔,您有一个合理的时间段在其中分派任务。它还为您提供了合理启动的窗口。

    可以通过维护一个有序列表来完成实施,该列表列出了接下来需要发生哪些 api 调用并将超时设置为其中的一部分。

    【讨论】:

    • ... 或一小堆时间 :-) 堆不会出现那么多;我想我什至更多地使用了三叉树。
    • 哈哈!好点子。订单列表肯定有替代品。
    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多