为什么Dart中Isolate内调用readLineSync无法正常工作?
问题原因
- 主Isolate提前终止进程
Isolate.spawn属于异步非阻塞调用,主Isolate执行完spawn逻辑后没有任何阻塞等待逻辑,会直接走完main函数流程退出。Dart进程会随主Isolate的退出直接销毁所有子Isolate,你的子Isolate还没来得及执行stdin.readLineSync()就被终止了,自然不会弹出输入提示也不会等待输入。 - 标准输入的隔离限制
Dart的Isolate之间完全隔离,除了端口消息传递外没有任何共享空间,系统标准输入(stdin)作为全局资源默认由主Isolate持有监听权限,即使你让主Isolate等待子Isolate执行,部分平台的子Isolate调用stdin.readLineSync()也会直接返回null或者无法读取到实际输入。
修复方案
最优做法是把输入交互逻辑放在主Isolate执行,再把输入结果传给子Isolate做后续处理,参考代码:
import 'dart:io'; import 'dart:isolate'; void handleInput(String input) { // 子Isolate处理逻辑 print('子Isolate收到输入:$input'); } void main(List<String> args) async { print('请输入内容:'); String? input = stdin.readLineSync(); if (input != null) { await Isolate.spawn(handleInput, input); } // 等待子Isolate处理完成 await Future.delayed(Duration(seconds: 1)); }
如果必须要在子Isolate内读取输入,需要给主Isolate添加等待逻辑,保证子Isolate执行完成前进程不会退出,参考代码:
import 'dart:io'; import 'dart:isolate'; void readInput(SendPort sendPort) { String? name = stdin.readLineSync(); sendPort.send(name); } void main(List<String> args) async { final receivePort = ReceivePort(); await Isolate.spawn(readInput, receivePort.sendPort); // 阻塞主Isolate等待子Isolate返回结果 final result = await receivePort.first; print('读取结果:$result'); receivePort.close(); }
内容的提问来源于stack exchange,提问作者Avan
相关产品推荐
相关产品推荐

