You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:24:01