Future的超时方法是否被破坏?

时间:2014-03-18 06:18:14

标签: dart dart-async

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

2 个答案:

答案 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');
  }
}