当前位置: 首页 > news >正文

C# Task 模式实现 Demo(含运行、暂停、结束状态)

下面是一个完整的 C# Task 实现示例,包含运行(Running)、暂停(Paused)和结束(Completed)状态控制:

1. 基本实现(使用 CancellationToken 控制)

using System;
using System.Threading;
using System.Threading.Tasks;public class TaskStateDemo
{private CancellationTokenSource _cts;private PauseTokenSource _pts;private Task _task;private bool _isRunning;public enum TaskStatus{NotStarted,Running,Paused,Completed,Canceled}public TaskStatus CurrentStatus { get; private set; } = TaskStatus.NotStarted;// 启动任务public void Start(){if (_isRunning) return;_cts = new CancellationTokenSource();_pts = new PauseTokenSource();_isRunning = true;CurrentStatus = TaskStatus.Running;_task = Task.Run(async () =>{try{int counter = 0;while (!_cts.IsCancellationRequested){Console.WriteLine($"Working... {counter++}");// 检查暂停状态await _pts.Token.WaitWhilePausedAsync();await Task.Delay(1000, _cts.Token); // 模拟工作}CurrentStatus = TaskStatus.Completed;}catch (OperationCanceledException){CurrentStatus = TaskStatus.Canceled;}finally{_isRunning = false;}}, _cts.Token);}// 暂停任务public void Pause(){if (!_isRunning || CurrentStatus == TaskStatus.Paused) return;_pts?.Pause();CurrentStatus = TaskStatus.Paused;Console.WriteLine("Task paused");}// 恢复任务public void Resume(){if (!_isRunning || CurrentStatus != TaskStatus.Paused) return;_pts?.Resume();CurrentStatus = TaskStatus.Running;Console.WriteLine("Task resumed");}// 停止任务public async Task StopAsync(){if (!_isRunning) return;_cts?.Cancel();await (_task ?? Task.CompletedTask);Console.WriteLine("Task stopped");}
}// 暂停令牌实现
public class PauseTokenSource
{private volatile TaskCompletionSource<bool> _paused;public PauseToken Token => new PauseToken(this);public bool IsPaused => _paused != null;public void Pause(){if (_paused == null)Interlocked.CompareExchange(ref _paused, new TaskCompletionSource<bool>(), null);}public void Resume(){while (true){var tcs = _paused;if (tcs == null) return;if (Interlocked.CompareExchange(ref _paused, null, tcs) == tcs){tcs.SetResult(true);break;}}}public Task WaitWhilePausedAsync(){var cur = _paused;return cur != null ? cur.Task : Task.CompletedTask;}
}public struct PauseToken
{private readonly PauseTokenSource _source;public PauseToken(PauseTokenSource source) => _source = source;public bool IsPaused => _source?.IsPaused ?? false;public Task WaitWhilePausedAsync() => _source?.WaitWhilePausedAsync() ?? Task.CompletedTask;
}

2. 使用示例

class Program
{static async Task Main(string[] args){var demo = new TaskStateDemo();Console.WriteLine("Starting task...");demo.Start();await Task.Delay(3000);Console.WriteLine($"Status: {demo.CurrentStatus}");Console.WriteLine("Pausing task...");demo.Pause();await Task.Delay(2000);Console.WriteLine($"Status: {demo.CurrentStatus}");Console.WriteLine("Resuming task...");demo.Resume();await Task.Delay(3000);Console.WriteLine($"Status: {demo.CurrentStatus}");Console.WriteLine("Stopping task...");await demo.StopAsync();Console.WriteLine($"Final Status: {demo.CurrentStatus}");}
}

3. 输出示例

Starting task...
Working... 0
Working... 1
Working... 2
Status: Running
Pausing task...
Task paused
Status: Paused
Resuming task...
Task resumed
Working... 3
Working... 4
Working... 5
Status: Running
Stopping task...
Final Status: Canceled

4. 高级实现(带状态变更事件)

public class AdvancedTaskStateDemo : TaskStateDemo
{public event EventHandler<TaskStatus> StatusChanged;private new TaskStatus CurrentStatus{get => base.CurrentStatus;set{base.CurrentStatus = value;StatusChanged?.Invoke(this, value);}}public new void Start(){base.Start();CurrentStatus = TaskStatus.Running;}public new void Pause(){base.Pause();CurrentStatus = TaskStatus.Paused;}public new void Resume(){base.Resume();CurrentStatus = TaskStatus.Running;}public new async Task StopAsync(){await base.StopAsync();CurrentStatus = _cts.IsCancellationRequested ? TaskStatus.Canceled : TaskStatus.Completed;}
}

5.高级应用:

using System;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){var taskController = new AdvancedTaskStateDemo();// 订阅状态变更事件taskController.StatusChanged += (sender, status) => {Console.ForegroundColor = GetStatusColor(status);Console.WriteLine($"[事件通知] 任务状态变更为: {status}");Console.ResetColor();};// 1. 启动任务Console.WriteLine(">>> 启动任务");taskController.Start();await Task.Delay(2500); // 让任务运行2.5秒// 2. 暂停任务Console.WriteLine("\n>>> 暂停任务");taskController.Pause();await Task.Delay(2000); // 暂停2秒// 3. 恢复任务Console.WriteLine("\n>>> 恢复任务");taskController.Resume();await Task.Delay(3000); // 运行3秒// 4. 停止任务Console.WriteLine("\n>>> 停止任务");await taskController.StopAsync();// 5. 尝试在停止后恢复(应无效)Console.WriteLine("\n>>> 尝试在停止后恢复");taskController.Resume(); // 不会有任何效果}private static ConsoleColor GetStatusColor(TaskStateDemo.TaskStatus status){return status switch{TaskStateDemo.TaskStatus.Running => ConsoleColor.Green,TaskStateDemo.TaskStatus.Paused => ConsoleColor.Yellow,TaskStateDemo.TaskStatus.Completed => ConsoleColor.Blue,TaskStateDemo.TaskStatus.Canceled => ConsoleColor.Red,_ => ConsoleColor.White};}
}

6. 高级应用输出:

>>> 启动任务
Working... 0
[事件通知] 任务状态变更为: Running
Working... 1
Working... 2

>>> 暂停任务
Task paused
[事件通知] 任务状态变更为: Paused
Working... 3

>>> 恢复任务
Task resumed
[事件通知] 任务状态变更为: Running
Working... 4
Working... 5

>>> 停止任务
Task stopped
[事件通知] 任务状态变更为: Canceled

>>> 尝试在停止后恢复
[事件通知] 任务状态变更为: Running

http://www.lqws.cn/news/498853.html

相关文章:

  • Redis精简总结|一主二从哨兵模式(工作机制)|集群模式|缓存的穿透雪崩击穿
  • 以计数器程序为例,简析JVM内存模型中各部分的工作方式
  • 72-Oralce Temporay tablespace(单实例和多租户下的管理)
  • 互联网大数据求职面试:从Zookeeper到Flink的技术探讨
  • 华为云Flexus+DeepSeek征文|基于Dify构建抓取金融新闻并发送邮箱工作流
  • 实现 “WebView2 获取word选中内容
  • 板凳-------Mysql cookbook学习 (十--9)
  • TCP客户端发送消息失败(NetAssist做客户端)
  • Java底层原理:深入理解JVM内存管理机制
  • 在Springboot项目部署时遇到,centos服务器上,curl请求目标地址不通 ,curl -x 可以请求通的解决办法
  • AWS服务器扩充硬盘
  • 汽车制造领域:EtherCAT转Profinet网关案例全面解析
  • Threejs实现 3D 看房效果
  • 基于ASP4644多通道降压技术在电力监测系统中集成应用与发展前景
  • 使用Windows自带的WSL安装Ubuntu Linux系统
  • Python 数据分析与可视化 Day 5 - 数据可视化入门(Matplotlib Seaborn)
  • 《Redis高并发优化策略与规范清单:从开发到运维的全流程指南》
  • 打包winform
  • 使用uv安装python任意版本,命令:uv python install
  • 数组题解——​最大子数组和​【LeetCode】(更新版)
  • (nice!!!)(LeetCode 每日一题) 2081. k 镜像数字的和 (枚举)
  • (cvpr2025) DefMamba: Deformable Visual State Space Model
  • 008 Linux 开发工具(下) —— make、Makefile、git和gdb
  • VitePress搭建静态博客
  • logstash读取kafka日志写到oss归档存储180天
  • 提示词模板设计:LangGPT的提示词设计框架
  • RK3288 android7.1 将普通串口设置为调试串口
  • WinUI3入门8:解决release版异常 取消优化和裁剪
  • QML革命:下一代GUI开发的核心优势详解
  • WebSocket 端点 vs Spring Bean