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

例:

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 に答える
3

Dart には単一の実行スレッドがあります。

Dart 関数の実行が開始されると、終了するまで実行が継続されます。つまり、Dart 関数は他の Dart コードによって中断されることはありません。

イベント ループがパーツに切り替わらpopulateGridない場合、チェックは実行されません。つまり、関数による定期的なチェックを可能にする計算を導入して、コードをいくつかの部分に分割する必要があります。timeouttimeoutpopulateGridFuturetimeout

于 2014-03-18T08:06:21.580 に答える