2

我有一个长时间运行的任务,我想与 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版本下也许我只是误解了如何使用超时

4

2 回答 2

3

Dart 有一个执行线程

一旦 Dart 函数开始执行,它就会继续执行直到退出。换句话说,Dart 函数不能被其他 Dart 代码中断。

如果populateGrid不允许事件循环切换到该timeout部分,timeout则不会执行检查。这意味着您必须通过引入计算将代码分成几个部分,允许函数进行定期检查。populateGridFuturetimeout

于 2014-03-18T08:06:21.580 回答
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');
  }
}
于 2014-03-18T08:11:03.920 回答