Дарт: запустите два метода одновременно и дождитесь их завершения - PullRequest
0 голосов
/ 26 декабря 2018

Я играю с дартс / флаттер, и я не могу понять, как запустить две функции в то же самое время и ждать, пока они завершат.

По-видимому, я должен использовать isolate.spawn, ноне может заставить что-либо работать, например:

t1(dynamic t) {
  sleep(Duration(seconds: 10));
}

t2(dynamic t) {
  sleep(Duration(seconds: 10));
}

main() async {
  Future f1 = Isolate.spawn(getThing, null);
  Future f2 =  Isolate.spawn(getThing1, null);
  Future.wait([f1,f2]);
}

Пока две функции выполняются, вызов Future.wait не ждет их завершения.

Тогда естьПроблема в том, как мне поступить с любыми возвращаемыми значениями из функций.

Кто-нибудь?ТИА.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вы можете найти package:isolate полезным здесь.

import 'dart:io';

import 'package:isolate/isolate.dart';

t1(dynamic t) {
  sleep(Duration(seconds: 10));
}

t2(dynamic t) {
  sleep(Duration(seconds: 10));
}

void main() async {
  var isolate1 = await IsolateRunner.spawn();
  var isolate2 = await IsolateRunner.spawn();
  var f1 = isolate1.run(t1, null);
  var f2 = isolate2.run(t2, null);
  await Future.wait([f1, f2]);
  await Future.wait([isolate1.close(), isolate2.close()]);
}
0 голосов
/ 26 декабря 2018

Ваш фрагмент не работает, потому что Isolate.spawn возвращает будущее, которое завершится экземпляром Isolate, если порождение завершилось успешно, а не когда точка входа, в данном случае t1 и t2, return.

Для обработки возвращаемых значений порожденных функций вы можете использовать ReceivePort.Например:

import 'dart:io';
import 'dart:isolate';

t1(port) {
  sleep(Duration(seconds: 3));
  port.send(["t1", 1]);
}

t2(port) {
  sleep(Duration(seconds: 6));
  port.send(["t2", 2]);
}

main() async {
  var receivePort = new ReceivePort();

  Isolate.spawn(t1, receivePort.sendPort);
  Isolate.spawn(t2, receivePort.sendPort);

  await for (var retMsg in receivePort) {
    print("res: $retMsg");

    if (retMsg[0] == "t2") {
      return;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...