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

C#中 单线程使用 CancellationTokenSource 进行线程管理

1. Xaml 代码

<Grid Margin="20"><StackPanel Width="150" HorizontalAlignment="Left"><ButtonMargin="0,10,0,10"Click="BtnClick_StartTask"Content="开始任务"Style="{StaticResource BtnStyle}" /><ButtonMargin="0,10,0,10"Click="BtnClick_StopTask"Content="停止任务"Style="{StaticResource BtnStyle}" /><ButtonMargin="0,10,0,10"Click="BtnClick_PauseTask"Content="暂停任务"Style="{StaticResource BtnStyle}" /><ButtonMargin="0,10,0,10"Click="BtnClick_ResumTask"Content="恢复任务"Style="{StaticResource BtnStyle}" /></StackPanel>
</Grid>

2. 代码实现

public partial class TestCancellationTokenThread : Window
{private CancellationTokenSource? _cts = null;private Task? _task = null;private volatile bool _isPause = false;     //使用 volatile 修饰,对于当下 bool 类型的简单操作,可以替代 lock//private readonly object _lock = new object();public TestCancellationTokenThread(){InitializeComponent();}private void BtnClick_StartTask(object sender, RoutedEventArgs e){if ((_cts != null && !_cts.Token.IsCancellationRequested) || (_task != null && !_task.IsCompleted)){Debug.WriteLine("任务正在运行...");return;}_cts = new();_isPause = false;   //启动任务后,自动开始Debug.WriteLine("任务开始运行...");//如果用:new Task() 构造函数方式,外层的 Task 会立刻完成,不会等待里层的 async 方法//而使用 Task.Run() + async lambda, 才是正确嵌套 Task。Task.WaitAsync 完成则表示内部真正完成。_task =  Task.Run(async () => {int num = 0;var token = _cts.Token; //使用本地 token,避免循环中重复访问 _ctswhile (!token.IsCancellationRequested){if (!_isPause){Debug.WriteLine(num);num++;}try{await Task.Delay(1000, token);  //取消时会立即抛出异常}catch (OperationCanceledException){break;  //取消时立刻退出}}}, _cts.Token);}private async void BtnClick_StopTask(object sender, RoutedEventArgs e){if (_cts == null) return;if (!_cts.IsCancellationRequested){_cts.Cancel();}try{if (_task != null){await _task.WaitAsync(TimeSpan.FromSeconds(3));}}catch (TimeoutException){Debug.WriteLine("任务停止超时...");}finally{_cts.Dispose();_cts = null;_task = null;}Debug.WriteLine("任务已停止");}private void BtnClick_PauseTask(object sender, RoutedEventArgs e){_isPause = true;}private void BtnClick_ResumTask(object sender, RoutedEventArgs e){_isPause = false;}}

3. 运行界面

http://www.dtcms.com/a/422711.html

相关文章:

  • .NET Core项目中 Serilog日志文件配置
  • 哈尔滨网站开发培训百度seo站长工具
  • 九江建设网站公司中信建设有限责任公司集采
  • DynImg论文阅读
  • 适合推广的网站wordpress自动标签加链接
  • ChatBI的相关学习
  • 【常用的git命令】
  • SNK施努卡汽车一体式天幕生产线
  • Celery时区设置问题源码探究
  • 音元分析流程
  • 懂的建设网站上海做网站优化
  • OpenLayers的OGC服务 -- 章节一:WMS服务详解
  • [信号与系统个人笔记]第三章 连续时间信号与系统的频域分析 Part 4
  • 多渠道打包gradle配置
  • 集中式架构还是分布式架构?SCADA架构选型的新趋势
  • 第八章 财务报表 2利润表(2025版)
  • 在Trae上使用Bright Data MCP采集数据,实时获取IPhone17价格信息
  • 番禺网站推广湖南网站建设有限公司
  • 刷题 | 牛客 - 前端面试手撕题 - 中等 - 1-2/20 知识点解答
  • 建立自动化SSL证书更新机制与多层监控体系
  • 岚图汽车 x Apache Doris : 海量车联网数据实时分析实践
  • chrome-devtools-mcp windows 环境安装
  • IOT_通讯控制器(IO模块)
  • 分布式计数器系统完整解决方案
  • 音频类AI工具扩展
  • PyCharm 开发 Python 项目后,将其打包并部署到 Nginx 服务器
  • 在 Trae 国际版中添加 Chrome Dev MCP Server(Windows 实战指南)
  • 个人商城网站备案互联网域名是什么意思
  • 太原微信网站商城网站建设定制
  • VR 太阳光参数与快速渲染