C# Task 实战知识点:进度条(暂停、继续、取消) 📅 2026/7/21 23:47:47 一、核心功能说明本案例使用Task 异步任务 自定义暂停标记 取消令牌实现完整进度条控制逻辑开始进度条滚动暂停进度条继续进度条终止/重置进度条彻底替代老旧 Thread.Abort、Suspend 等废弃 API是标准 Task 业务控制写法。二、核心原理1. 双标记控制逻辑bool pause自定义暂停标记控制任务临时停止循环暂停/继续CancellationTokenSource cts取消令牌控制任务彻底终止、重置2. 任务循环执行条件!cts.IsCancellationRequested !pause i 100没有取消、没有暂停、进度未满 → 继续跑进度pausetrue → 暂停卡死循环 → 进度暂停cts.Cancel() → 触发取消 → 任务终止、重置进度三、完整独立可运行代码public partial class Form1 : Form { public Form1() { InitializeComponent(); // 初始按钮状态锁定 button2.Enabled false; button3.Enabled false; button4.Enabled false; } bool pause false; // 暂停标记 CancellationTokenSource cts; // 任务取消令牌 int i 0; // 进度值 Task task; // 进度条任务 // 开始任务 private void button1_Click(object sender, EventArgs e) { // 每次新开任务必须新建取消令牌 cts new CancellationTokenSource(); task new Task(() { // 循环控制进度条 while (!cts.IsCancellationRequested !pause i 100) { Thread.Sleep(100); // 跨线程安全更新UI try { Invoke(new Action(() { progressBar1.Value i; })); } catch { // 防止窗体关闭时UI报错 } i; } // 进度走完 / 取消任务 → 重置进度 if (i 100 || cts.IsCancellationRequested) { Invoke(new Action(() { progressBar1.Value 0; i 0; })); } }, cts.Token); task.Start(); // 切换按钮状态 button1.Enabled false; button2.Enabled true; button4.Enabled true; } // 暂停 private void button2_Click(object sender, EventArgs e) { pause true; button2.Enabled false; button3.Enabled true; } // 继续 private void button3_Click(object sender, EventArgs e) { pause false; // 复用开始逻辑继续执行任务 button1_Click(null, null); button3.Enabled false; button2.Enabled true; button4.Enabled true; } // 终止并重置 private void button4_Click(object sender, EventArgs e) { // 触发任务取消 cts.Cancel(); // 重置所有状态 button1.Enabled true; button2.Enabled false; button3.Enabled false; button4.Enabled false; progressBar1.Value 0; i 0; pause false; } }四、模块执行流程点击开始新建令牌、启动Task、进度条递增点击暂停pausetruewhile循环卡住进度停止点击继续pausefalse重新触发任务执行进度继续上涨点击终止cts.Cancel() 取消任务清空进度、重置所有标记五、核心注意事项考试/作业重点Task 不能重复启动暂停继续时通过重新调用点击事件实现续跑取消令牌不可复用每一次新开任务必须 new 新的 CancellationTokenSource暂停使用自定义bool标记属于优雅暂停不销毁任务取消使用CancellationToken属于安全终止淘汰 Task.Abort 暴力终止子线程更新UI必须使用 Invoke防止跨线程报错添加 try-catch 避免窗体关闭瞬间UI控件销毁导致报错进度满100或主动取消都会自动归零复位保证下次可重跑六、考点总结必背暂停原理bool标记卡住循环 → 温柔暂停取消原理CancellationToken 信号终止任务 → 安全退出UI更新子线程 Invoke 回调主线程刷新进度条优势全程无废弃API、无暴力销毁、界面不卡顿、可重复使用