3

準備ができていれば、Future を返す時間のかかる関数を作成する必要があります。以下のアプローチは正しいですか、それとも 9 行目の私の時間のかかるアルゴリズムは、準備が整うまでプログラムをブロックしますか? この場合、イベントループに制御を戻すために、または他に何が解決策になるのでしょうか?

Future<int> timeconsumingFunctionReturningFuture(int i) {
  var completer = new Completer();

  if (i==0) { 
    completer.completeError(88);
    return completer.future;
  } else {
    int rc;
    // Line9: rc = timeconsuming algorithm, to calculate rc
    completer.complete(rc);
    return completer.future;
  }
}

TNXミカ

4

2 に答える 2

3

アルゴリズムがコンプリータの戻りをブロックする可能性があるため、コードはおそらく期待どおりに機能しないでしょう。このようにしてみてください:

Future<int> timeconsumingFunctionReturningFuture(int i) {
  var completer = new Completer();

  if (i==0) { 
    completer.completeError(88);
  } else {
    Timer.run(() {
      int rc;
      // Line9: rc = timeconsuming algorithm, to calculate rc
      completer.complete(rc);
    });
  }
  return completer.future;
}

このようにして、時間のかかるアルゴリズムが非同期で実行され、未来がすぐに返されます。

私は自分で試したことはありませんが、この短いバージョンも機能するはずです(コンプリートを作成せずに)

return new Future.delayed(Duration.ZERO, () {
    // timeconsuming algorithm
  });
于 2014-01-01T12:59:00.703 に答える