未来的超时方法坏了吗?



我有一个长时间运行的任务,我想与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');
  }
}

最新更新