我有一个长期运行的任务,我想与Future异步运行,但我也希望它最终超时。在我看来,我的超时永远不会被调用 - 但也许我没有正确使用超时?
// do actual solution finding asychronously
Future populateFuture = new Future(() {
populateGrid(words, gridWidth, gridHeight);
});
populateFuture.timeout(const Duration(seconds: 3), onTimeout: () {
window.alert("Could not create a word search in a reasonable amount of time.");
});
// after being done, draw it if one was found
populateFuture.then((junk) {
wordSearchGrid.drawOnce();
});
这是版本1.3.0-dev.4.1也许我只是误解了如何使用超时
答案 0 :(得分:3)
Dart有a single thread of execution。
一旦Dart函数开始执行,它将继续执行直到退出。换句话说,Dart函数不能被其他Dart代码中断。
如果populateGrid
不允许the event loop切换到timeout
部分,则timeout
检查将不会执行。这意味着您必须通过引入populateGrid
计算来将Future
的代码打开到几个部分,以允许timeout
函数进行定期检查。
答案 1 :(得分:3)
一个例子:
import 'dart:async';
import 'dart:math';
void main(args) {
var f = new Future(()=>burnCpu());
f.timeout(const Duration(seconds: 3));
}
bool signal = false;
int i = 0;
var r = new Random();
Future burnCpu() {
if (i < 1000000) {
i++;
return new Future(() { // can only interrupt here
print(i);
for (int j = 0; j < 1000000; j++) {
var a = (j / r.nextDouble()).toString() + r.nextDouble().toString();
}
}).then((e) => burnCpu());
} else {
return new Future.value('end');
}
}