为什么 readLineSync 在 Isolate 中不起作用

Why doesn't readLineSync works in an Isolate

void func(String dummy) {
  String? name = stdin.readLineSync();
  print(name);
  
}
void main(List<String> args) {
  Isolate.spawn(func, "Testing");

}

为什么我的程序不提示用户输入..并等待我输入。相反,它只是退出。有人可以帮我解释一下吗?不知道去哪里看。

我确实在他们使用 while 循环并在其中使用 readLineSync 的地方发现了一个类似的问题..并且由于飞镖的单线程..它在那里不起作用。

Dart 程序在 main-isolate 不再需要做任何事、事件队列中没有事件并且不订阅任何事件源时终止,这会导致新事件被添加到事件队列中(比如 ReceivePortTimer)。生成的 isolate 是否仍在执行并不重要,因为它们只会被杀死。

你需要让 main-isolate 做一些事情,或者使用 ReceivePort/SendPort 让 main-isolate 订阅来自你生成的 isolate 的信号,因为这会阻止 main-隔离被终止(因为它订阅了一个事件源,该事件源可能会在事件队列中添加新事件)。

可以在此处查看在 Isolate 对象上使用 addOnExitListener 的示例:

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

void func(String dummy) {
  print('Enter your name:');
  final name = stdin.readLineSync();
  print('Your name is: $name');
}

Future<void> main(List<String> args) async {
  final onExitReceivePort = ReceivePort();
  final isolate = await Isolate.spawn(func, "Testing");

  isolate.addOnExitListener(
    onExitReceivePort.sendPort,
    response: 'ReadLineIsolateStopped',
  );

  // Listen on spawned isolate is stopped event
  await for (final onExitEvent in onExitReceivePort) {
    print('Got event: $onExitEvent');
    onExitReceivePort.close();
  }
}

我们在这里关闭 onExitReceivePort 一旦我们得到一个事件(因为生成的 isolate 然后消失了)这将停止我们的 main-isolate 和程序的其余部分。