Метод тайм-аута Future не работает?

У меня есть длительная задача, которую я хочу запустить асинхронно с 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 Возможно, я просто неправильно понимаю, как использовать тайм-аут


person davecom    schedule 18.03.2014    source источник


Ответы (2)


Dart имеет один поток выполнения.

Как только функция Dart начинает выполняться, она продолжает выполняться до тех пор, пока не завершится. Другими словами, функции Dart не могут быть прерваны другим кодом Dart.

Если populateGrid не позволяет циклу событий переключитесь на часть timeout, проверки timeout выполняться не будут. Это означает, что вам нужно разбить код populateGrid на несколько частей, внедрив Future вычисления, чтобы обеспечить регулярные проверки функцией timeout.

person Alexandre Ardhuin    schedule 18.03.2014

Пример:

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');
  }
}
person Günter Zöchbauer    schedule 18.03.2014