【问题标题】:Why doesn't readLineSync works in an Isolate为什么 readLineSync 不能在 Isolate 中工作
【发布时间】:2021-12-01 18:15:55
【问题描述】:
void func(String dummy) {
  String? name = stdin.readLineSync();
  print(name);
  
}
void main(List<String> args) {
  Isolate.spawn(func, "Testing");

}

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

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

【问题讨论】:

    标签: dart dart-isolates


    【解决方案1】:

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

    您需要让主隔离来做某事,或者使用ReceivePort/SendPort 让主隔离订阅来自您生成的隔离的信号,因为这将防止主隔离被终止(因为它订阅的事件源可能会在事件队列中添加新事件)。

    可以在此处查看在 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,一旦我们得到一个事件(因为生成的隔离然后消失了),这将停止我们的主隔离和程序的其余部分。

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多