一、基础实现方式:同步阻塞等待
通过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
通过灵活组合这些方案,可满足从简单定时退出到复杂交互场景的全方位需求。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。