C# 控制台程序实现定时自动退出

article/2025/8/25 4:41:11

一、基础实现方式:同步阻塞等待

通过Thread.Sleep暂停主线程,适合简单场景(需阻塞当前线程)。

static void Main(string[] args)
{
    Console.WriteLine("程序启动,5秒后自动退出...");
    Thread.Sleep(5000); // 阻塞5秒
    Environment.Exit(0); // 确保进程终止
}

‌特点‌:

代码简单,无需复杂逻辑
主线程完全阻塞,无法执行其他操作
适用场景:无需交互的后台任务


二、后台计时器方案:非阻塞式延迟

使用System.Threading.Timer实现后台计时,主线程可继续执行其他任务。

static void Main(string[] args)
{
    Console.WriteLine("程序运行中,3秒后自动关闭...");
    
    // 创建计时器(延迟3秒,只触发一次)
    Timer exitTimer = new Timer(_ => 
    {
        Console.WriteLine("时间到,程序退出");
        Environment.Exit(0);
    }, null, 3000, Timeout.Infinite);

    // 主线程可继续处理其他逻辑
    Console.ReadKey(); // 保持程序运行
}

‌特性‌:

非阻塞,主线程可响应其他操作
需手动保持程序运行(如Console.ReadKey())
适用场景:需同时执行任务的守护进程


三、异步编程实现:现代推荐方案

通过Task.Delay实现异步等待(.NET Framework 4.5+ / .NET Core)。

static async Task Main(string[] args) // C# 7.1+ 支持异步Main
{
    Console.WriteLine("10秒后自动关闭");
    
    // 启动异步任务
    var exitTask = Task.Run(async () => 
    {
        await Task.Delay(10000);
        Environment.Exit(0);
    });

    // 主线程可并行处理其他逻辑
    while (true) 
    {
        Console.Write(".");
        await Task.Delay(500); // 模拟工作
    }
}

‌特性‌:

完美整合异步操作
支持Ctrl+C提前终止
 适用场景:现代控制台应用(.NET 5+)


四、带倒计时显示的高级方案

实时显示剩余时间,提升用户体验。

static void Main(string[] args)
{
    int totalSeconds = 10;
    Console.CursorVisible = false;

    for (int i = totalSeconds; i > 0; i--)
    {
        Console.Write($"剩余时间:{i}秒  ");
        Thread.Sleep(1000);
        Console.SetCursorPosition(0, Console.CursorTop);
    }
    
    Console.WriteLine("\n时间到,程序终止");
    Environment.Exit(0);
}

‌效果‌:

剩余时间:5秒  
(每秒刷新数字)

五、方案对比与选型建议

‌方法‌    ‌            线程模型‌            可交互性        复杂度        适用版本
Thread.Sleep    同步阻塞            不可交互        一星            全平台兼容
System.Timer    异步回调            可交互        二星            .NET Framework 2.0+
Task.Delay        异步非阻塞        可交互        三星            .NET 4.5+/Core
倒计时循环        同步阻塞            不可交互        二星            全平台兼容


‌选型指南‌:

‌简单脚本工具‌ → Thread.Sleep
‌需要后台处理‌ → System.Threading.Timer
‌现代异步应用‌ → Task.Delay + 异步Main
‌需要用户提示‌ → 倒计时方案


六、注意事项

1、资源释放‌:使用Timer时需调用Dispose(),避免内存泄漏

exitTimer?.Dispose();

‌2、提前退出控制‌:可结合CancellationToken实现优雅终止

var cts = new CancellationTokenSource();
Task.Delay(5000, cts.Token).ContinueWith(_ => Exit());
Console.ReadKey();
cts.Cancel(); // 取消自动退出

‌3、跨平台兼容‌:.NET Core推荐使用Task.Delay代替Thread.Sleep

通过灵活组合这些方案,可满足从简单定时退出到复杂交互场景的全方位需求。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 


http://www.hkcw.cn/article/qJSqYUESyD.shtml

相关文章

【笔记】suna部署之获取 Firecrawl API key

#工作记录 Firecrawl 一、前期准备 在进行 Suna 部署时,获取 Firecrawl API key 是其中一个关键步骤。Firecrawl 是一款功能强大的工具,在 Suna 项目中可发挥重要作用,比如助力数据获取等相关任务。 二、获取步骤 (一&#xff…

花哨桌面 V 3.0.0 (火影忍者版)

废话不多说,直接上链接,源码在之前版本的帖子里,本次主要修改了部分元素. 功能也不描述了哦 效果图

西门子PLC结构化编程_优化后的调节阀标准块

文章目录 前言一、功能概述二、程序编写1.新建数据类型“5_RegvalveType”2.新建FB块“6_Regvalve”3.SCL和LAD混合编程 总结 前言 在之前的文章中,分享过一个基于SCL语言实现的调节阀控制块西门子PLC常用底层逻辑块分享_调节阀,在实际应用过程中&#…

react-color-palette源码解析

项目中用到了react-color-palette组件,以前对第三方组件都是不求甚解,这次想了解一下其实现细节。 简介 react-color-palette 是一个用于创建颜色调色板的 React 组件。它提供了一个简单易用的接口,让开发者可以轻松地创建和管理颜色调色板。…

(一)视觉——工业相机(以海康威视为例)

一、工业相机介绍 工业相机是机器视觉系统中的一个关键组件,其最本质的功能就是将光信号转变成有序的电信号。选择合适的相机也是机器视觉系统设计中的重要环节,相机的选择不仅直接决定所采集到的图像分辨率、图像质量等,同时也与整个系统的运…

PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿

什么是PnP算法? PnP 全称是 Perspective-n-Point,中文叫“n点透视问题”。它的目标是: 已知一些空间中已知3D点的位置(世界坐标)和它们对应的2D图像像素坐标,求解摄像机的姿态(位置和平移&…

C++核心编程_4.5 运算符重载_4.5.1 加号运算符重载

#include <iostream> #include <string> using namespace std;/* ### 4.5 运算符重载 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 *//* 4.5.1 加号运算符重载 作用&#xff1a;实现两…

文本预处理

文本预处理 1 词向量表示 1.1 word2vec之skipgram方式&#xff1a; 定义&#xff1a;给你一段文本&#xff0c;选定特定的窗口长度&#xff0c;然后利用中间词来预测上下文 实现过程&#xff1a;1、选定一个窗口长度&#xff1a;3、5、7等&#xff1b;2、指定词向量的维度&a…

C++中单例模式详解

在C中&#xff0c;单例模式 (Singleton Pattern) 确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这在需要一个全局对象来协调整个系统行为的场景中非常有用。 为什么要有单例模式&#xff1f; 在许多项目中&#xff0c;某些类从逻辑上讲只需要一个实…

什么是单片机?

众所周知&#xff0c;人类行为受大脑调控&#xff0c;正如视觉、听觉、味觉、嗅觉、触觉及运动功能等感官与肢体活动均受其指挥&#xff1b;换言之&#xff0c;大脑作为人体的中枢神经系统&#xff0c;负责管理所有可控制的生理功能。 在电子设备领域&#xff0c;单片机…

DMBOK对比知识点整理(4)

1.常见数据质量维度 常见数据质量维度(DMBOK-P353)质量维度

Web攻防-SQL注入增删改查盲注延时布尔报错有无回显错误处理

知识点&#xff1a; 1、Web攻防-SQL注入-操作方法&增删改查 2、Web攻防-SQL注入-布尔&延时&报错&盲注 案例说明&#xff1a; 在应用中&#xff0c;存在增删改查数据的操作&#xff0c;其中SQL语句结构不一导致注入语句也要针对应用达到兼容执行&#xff0c;另…

动态规划-152.乘积最大子数组-力扣(LeetCode)

一、题目解析 根据示例nums数组中存在负数&#xff0c;下面分析时需注意 二、算法原理 1、状态表示 此时f[i]表示&#xff1a;以i位置为结尾的所有子数组中的最大乘积&#xff0c;但是由于nums中存在负数&#xff0c;所以还需要g[i]表示&#xff1a;以i位置为结尾的所有子数组…

Leetcode 159. 至多包含两个不同字符的最长子串

1.题目基本信息 1.1.题目描述 给你一个字符串 s &#xff0c;请你找出 至多 包含 两个不同字符 的最长子串&#xff0c;并返回该子串的长度。 1.2.题目地址 https://leetcode.cn/problems/longest-substring-with-at-most-two-distinct-characters/description/ 2.解题方法…

MATLAB 横向剪切干涉系统用户界面设计及其波前重构研究

▒▒本文目录▒▒ 一、横向剪切干涉系统效果预览二、引言三、横向剪切干涉理论基础四、MATLAB 横向剪切干涉系统用户界面设计五、参考文献六、实验指导与matlab代码获取 一、横向剪切干涉系统效果预览 开发的系统如下所示&#xff1a; 横向剪切干涉系统 二、引言 横向剪切干…

C54-动态开辟内存空间

1.malloc 原型&#xff1a;void* malloc(size_t size);&#xff08;位于 <stdlib.h> 头文件中&#xff09; 作用&#xff1a;分配一块连续的、未初始化的内存块&#xff0c;大小为 size 字节。 返回值&#xff1a; 成功&#xff1a;返回指向分配内存首地址的 void* 指针…

【Linux网络篇】:初步理解应用层协议以及何为序列化和反序列化

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.序列化和反序列化为什么需要序列化和反序列化为什么应用层…

【Tips】关于PCI和PCIe的配置空间差异和io/memory io读写

最近在看同事2023年讲的PCI基础课&#xff0c;感觉确实是豁然开朗了&#xff0c;赞美同事。 PCIe实际上是PCI的扩展&#xff08;extended&#xff09;&#xff0c;PCIe设备相当于是迭代升级产品。 而PCIe的配置空间基于PCI原有的0xFF&#xff08;256字节&#xff09;配置空间…

华为OD机试真题——阿里巴巴找黄金宝箱(III)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

拓扑排序算法剖析与py/cpp/Java语言实现

拓扑排序算法深度剖析与py/cpp/Java语言实现 一、拓扑排序算法的基本概念1.1 有向无环图&#xff08;DAG&#xff09;1.2 拓扑排序的定义1.3 拓扑排序的性质 二、拓扑排序算法的原理与流程2.1 核心原理2.2 算法流程 三、拓扑排序算法的代码实现3.1 Python实现3.2 C实现3.3 Java…