我有一个长时间运行的任务,我想与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也许我只是误解如何使用超时
Dart只有一个执行线程。
一旦Dart函数开始执行,它将继续执行直到退出。换句话说,Dart函数不能被其他Dart代码中断。
如果populateGrid
不允许事件循环切换到timeout
部分,timeout
检查将不会被执行。这意味着您必须通过引入Future
计算将将 populateGrid
的代码分解为几个部分,以允许timeout
函数定期检查。
示例:
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');
}
}