【问题标题】:dart timer periodic documentation is confusing飞镖计时器定期文档令人困惑
【发布时间】:2015-05-25 09:15:11
【问题描述】:

我有一个长时间运行的任务,我想在运行结束后以固定间隔安排新的运行,我发现了这个。以下是什么意思?特别是最后一段。

Timer.periodic(Duration duration, Function void callback(Timer timer))

创建一个新的重复计时器。

回调以持续时间间隔重复调用,直到 使用取消功能取消。

确切的时间取决于底层定时器的实现。不 超过 n 次回调将在 duration * n 时间内进行,但时间 两个连续回调之间的时间可以短于和长于 持续时间。

特别是,实现可能会安排下一个回调,例如, 上一个回调结束后的持续时间,当 上一个回调开始,或者当上一个回调被安排时 for - 即使实际回调被延迟。

【问题讨论】:

  • 表示无论前一个处于什么状态都会周期性调用回调。

标签: dart


【解决方案1】:

假设您将计时器设置为每 30 秒运行一次。如果第二次调用回调需要 10 秒才能完成,那么第三次调用回调可能是:

  • 第二次通话开始后 30 秒
  • 第二次通话结束后 30 秒(即第二次通话开始后 40 秒,因为需要 10 秒)
  • 在第二次调用计划运行后 30 秒(根据上述情况,可能会延迟,例如在第一次调用的持续时间内)

【讨论】:

  • 问题在于作品“可能”。所以在不同的系统上它会有不同的行为,这非常令人困惑。
  • 没错。确切的细节留给实现,尽管“在持续时间 * n 时间内将进行不超过 n 个回调”。对于大多数事情来说应该没问题(例如,大约每 x 分钟轮询一次),但不是作为一个准确的计时器。
  • 根据文档所说,如果需要高于典型精度的情况,将回调中运行的代码封装在 async lambda 中可能会有所帮助,即 Timer.periodic(duration,(){ ()async{ code_to_run; }() }); 虽然它可能仍然不准确,因为文档仅给出了一个示例,而不一定是所有不准确的情况。
【解决方案2】:

定时器的持续时间是延迟。 Timer.periodic 的持续时间是 period。

【讨论】:

    猜你喜欢
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2017-05-30
    相关资源
    最近更新 更多