Dart中如何实现指定时长后自动终止循环?
Dart指定时长后自动终止循环的实现方案
问题原因
Dart 基于单线程事件循环模型运行,现有代码存在两个核心错误:
- 无限同步
while(true)循环嵌套在Timer.periodic的回调内部,stdin.readLineSync()是阻塞式同步方法,会持续卡住当前线程等待用户输入,导致事件循环中后续的Timer触发事件无法被调度,timer.tick永远停留在第一次触发时的1,不会增长。 Timer.periodic本身是间隔触发回调的逻辑,第一次回调进入阻塞死循环后,后续所有事件都无法执行。
实现方法
要实现指定时长后自动终止循环,只需单独启动一次性Timer做超时计时,不要将业务循环嵌套在Timer回调内:
- 先启动超时Timer,到达指定时长后修改终止标记或直接执行退出逻辑
- 业务输入循环放在主流程正常执行,循环内判断终止标记即可
修正后代码
方案1:超时直接终止进程
import 'dart:async'; import 'dart:io'; main(List<String> args) { String? usrName; // 可自定义超时时长 const timeout = Duration(seconds: 5); // 单独启动超时计时器 Timer(timeout, () { print("\n已到达设定时长,程序终止"); exit(0); }); // 业务循环直接写在主流程 while (true) { print("What's your name?"); usrName = stdin.readLineSync(); if (usrName != null) { print("Welcome $usrName."); } } }
方案2:超时后先清理资源再退出
如果需要在终止前执行清理操作,用终止标记控制循环:
import 'dart:async'; import 'dart:io'; main(List<String> args) async { String? usrName; bool isTimeout = false; const timeout = Duration(seconds: 5); Timer(timeout, () { print("\n已到达设定时长,程序终止"); isTimeout = true; }); while (!isTimeout) { print("What's your name?"); usrName = stdin.readLineSync(); if (usrName != null) { print("Welcome $usrName."); } } // 此处可添加自定义清理逻辑 }
注:
stdin.readLineSync()本身是阻塞方法,如果用户一直不输入,即使isTimeout变为true,循环也会卡在输入等待步骤。如果需要实现完全无阻塞的超时输入,可改用stdin的异步流监听实现。
内容的提问来源于stack exchange,提问作者MD. Sajid Hossain
相关产品推荐
相关产品推荐

