dart 当我在其中使用`List.generate`时,计算方法没有完全执行,但是当我使用forloop时,计算方法被完全执行

pjngdqdw  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(82)

下面的程序用于理解dart中的isolatescompute方法被传递给派生的isolate。在compute方法内部执行求和,但当使用List.generate时,compute函数不会完成执行,因为print("The total sum is : $sum");语句从未被调用。
如果我们使用简单的for loopcompute()中的注解代码行),而不是使用List.generate,则会计算并显示sum

import "dart:isolate";

void main(final List<String> args) async {
  print("Entering main");
  final model = ModelClass(35000, 100);
  await Isolate.spawn<ModelClass>(compute, model);
  print("Exiting main");
}

void compute(final ModelClass model) {
  int sum = 0;
  for (int value in List.generate(model.iteration, (index) => index)) {
    sum += value * model.multiplier;
  }
  // for (int index = 0; index < model.iteration; index++) {
  //   sum += index * model.multiplier;
  // }
  print("The total sum is : $sum");
}

class ModelClass {
  final int iteration;
  final int multiplier;

  ModelClass(this.iteration, this.multiplier);
}

为什么当我们使用List.generate生成list并迭代它时,compute函数没有完成执行?

ws51t4hk

ws51t4hk1#

你的问题是,下面的await并没有执行派生的Isolate。相反,它只会在创建Isolate本身时执行await

await Isolate.spawn<ModelClass>(compute, model);

在此之后,您的主Isolate没有其他事情可做,并且没有任何方式稍后被任何类型的事件(例如来自RecievePortTimer或类似事件)触发。
Dart将因此退出您的程序,因为您的程序执行仅依赖于邮件Isolate。请参阅以下答案,了解Dart程序何时停止和不停止的更详细描述:https://stackoverflow.com/a/70670962/1953515
但简而言之,如果您希望在所有隔离完成执行后,首先停止程序,则需要让main隔离等待来自您衍生的隔离的一些答复。
Flutter中的compute()函数就是这样做的,因为它被设计为在一个单独的Isolate中运行给定的函数,然后将结果返回给调用者隔离。所以它会自动设置一个RecievePort/SendPort对。
在Dart中,你可以用Dart 2.19中新引入的Isolate.run来做同样的事情:https://api.dart.dev/stable/2.19.6/dart-isolate/Isolate/run.html

相关问题