为什么 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 不再需要做任何事、事件队列中没有事件并且不订阅任何事件源时终止,这会导致新事件被添加到事件队列中(比如 ReceivePort
或 Timer
)。生成的 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 和程序的其余部分。
void func(String dummy) {
String? name = stdin.readLineSync();
print(name);
}
void main(List<String> args) {
Isolate.spawn(func, "Testing");
}
为什么我的程序不提示用户输入..并等待我输入。相反,它只是退出。有人可以帮我解释一下吗?不知道去哪里看。
我确实在他们使用 while 循环并在其中使用 readLineSync
的地方发现了一个类似的问题..并且由于飞镖的单线程..它在那里不起作用。
Dart 程序在 main-isolate 不再需要做任何事、事件队列中没有事件并且不订阅任何事件源时终止,这会导致新事件被添加到事件队列中(比如 ReceivePort
或 Timer
)。生成的 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 和程序的其余部分。