Dart:使用零持续时间计时器是将工作延迟到事件循环的支持方式

时间:2012-11-06 03:44:10

标签: timer dart deferred-execution event-loop reentrancy

我通过试验发现创建一个持续时间为0的计时器允许我将工作推迟到事件队列中。我非常喜欢这个功能,因为它可以避免很多令人讨厌的重入问题。这种有意识的功能是否会改变?它可以添加到文档中吗?如果没有,是否有支持的方法来做到这一点?

1 个答案:

答案 0 :(得分:6)

当前答案

执行此操作的正确方法是使用scheduleMicrotask(Function callback)

请参阅此处的API文档:https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-async#id_scheduleMicrotask

关于异步任务和事件循环的精彩文章在这里:https://www.dartlang.org/articles/event-loop/

旧答案(飞镖前1.0)

目前,答案是肯定的,new Timer(0, callback)是推迟函数调用的最简单方法。

很快,希望http://dartbug.com/5691将被修复,并且会有更好的方法。 Timer的问题是HTML规范说回调应该在4ms之后发生。取决于您正在做的事情,可能存在问题。

Microsoft引入setImmediate()来解决此问题。在重绘之后,它会在下一个事件循环开始时调用回调。我在Dart中的首选解决方案是将Future.immediate()推迟到下一个事件循环,并且可能是像defer()这样的函数进行回调。

但即使有更好的解决方案,new Timer(0, f)仍然有用。我不介意为它做一个lint警告。