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

Dart中如何实现指定时长后自动终止循环?

Dart指定时长后自动终止循环的实现方案

问题原因

Dart 基于单线程事件循环模型运行,现有代码存在两个核心错误:

  • 无限同步while(true)循环嵌套在Timer.periodic的回调内部,stdin.readLineSync()是阻塞式同步方法,会持续卡住当前线程等待用户输入,导致事件循环中后续的Timer触发事件无法被调度,timer.tick永远停留在第一次触发时的1,不会增长。
  • Timer.periodic本身是间隔触发回调的逻辑,第一次回调进入阻塞死循环后,后续所有事件都无法执行。

实现方法

要实现指定时长后自动终止循环,只需单独启动一次性Timer做超时计时,不要将业务循环嵌套在Timer回调内:

  1. 先启动超时Timer,到达指定时长后修改终止标记或直接执行退出逻辑
  2. 业务输入循环放在主流程正常执行,循环内判断终止标记即可

修正后代码

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 05:36:03