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

使用CancellationTokenSource来控制长时间sql查询中断

前端

  <!-- 透明的覆盖层,显示在页面上方,包含进度条 --><Grid Visibility="{Binding IsLoading}" 
Background="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ZIndex="1"><Grid.InputBindings><MouseBinding Gesture="LeftDoubleClick" Command="{Binding CancelTaskCommand}" /></Grid.InputBindings><Border Background="Black" Opacity="0.5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"><!-- 使用 StackPanel 垂直排列进度条和文本 --><StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0, 50, 0, 0"><!-- 进度条居中显示 --><ProgressBar x:Name="LoadingProgressBar"IsIndeterminate="True"Height="50" Width="200" HorizontalAlignment="Center"VerticalAlignment="Center" Margin="0, 0, 0, 0"  MouseDoubleClick="LoadingProgressBar_MouseDoubleClick"/><!-- 显示的文字 --><TextBlock Text="双击屏幕取消查询"HorizontalAlignment="Center"Foreground="White"FontSize="30"VerticalAlignment="Center"/></StackPanel></Border></Grid>

后端代码

 private void LoadingProgressBar_MouseDoubleClick(object sender, MouseButtonEventArgs e){viewModel.CancelTaskCommand.Execute(null);}

viewModel代码

 [RelayCommand]private  async void SelectInfo(){try{string sql = "..........";ChangeLoadingStatus(true);//进入加载状态// 创建 CancellationTokenSource,并获取 CancellationToken_cancellationTokenSource = new CancellationTokenSource();var token = _cancellationTokenSource.Token;// 启动异步任务,并传递 tokenList<ToolStr50> result = await Task.Run(() => ExecuteQueryWithCancellation(sql, token), token); ChangeLoadingStatus(false);//结束加载状态TaxinclusiveSum = "合计含税金额:0";InfoCount = "数据汇总:0条";}catch (OperationCanceledException ex){ChangeLoadingStatus(false);//结束加载状态Notification.Error(ex.Message, millisecondTimeOut: 2200);}catch (Exception ex){ChangeLoadingStatus(false);//结束加载状态Notification.Error("系统异常-" + ex.Message, millisecondTimeOut: 2200);}}private async Task<List<ToolStr50>> ExecuteQueryWithCancellation(string sql, CancellationToken token){try{// 直接传递 CancellationToken 到数据库查询return await dal.db.SqlQueryable<ToolStr50>(sql).ToListAsync(token);  // 将 token 传递给 ToListAsync}catch (OperationCanceledException){// 如果任务被取消,处理取消逻辑throw new OperationCanceledException("查询已取消", null, token);}}[RelayCommand]// 取消任务的方法public void CancelTask(){_cancellationTokenSource?.Cancel(); // 请求取消}

http://www.lryc.cn/news/498573.html

相关文章:

  • 小红薯最新x-s 算法补环境教程12-06更新(下)
  • wazuh-modules-sca
  • Uniapp的App环境下使用Map获取缩放比例
  • 微信小程序配置less并使用
  • “全面支持公路数字化转型升级四大任务”视频孪生解决方案
  • 顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍
  • P3379 【模板】最近公共祖先(LCA)
  • 2030. gitLab A仓同步到B仓
  • 网易博客旧文-----如何在WINDOWS下载安卓(android)源代码并和eclipse做关联
  • MATLAB中axes函数用法
  • 构建 Java Web 应用程序:实现简单的增删查改(Mysql)
  • 3d行政区划-中国地图
  • 适合存储时序数据的数据库和存储系统
  • dolphinscheduler集群服务一键安装启动实现流程剖析
  • 深入了解Linux —— 学会使用vim编辑器
  • C05S01-Web基础和HTTP协议
  • MIT工具课第六课任务 Git基础练习题
  • 计算机网络安全
  • Delphi 实现键盘模拟、锁定键盘,锁定鼠标等操作
  • RTK数据的采集方法
  • Next.js 入门学习
  • 2024年认证杯SPSSPRO杯数学建模B题(第一阶段)神经外科手术的定位与导航解题全过程文档及程序
  • 安卓底层相机流的传输方式
  • 【单链表】(更新中...)
  • 开源堡垒机JumpServer配置教程:使用步骤与配置
  • 上门服务小程序开发,打造便捷生活新体验
  • iOS中的类型推断及其在Swift编程语言中的作用和优势
  • 工业检测基础-缺陷形态和相机光源选型
  • Python100道练习题
  • 2024年华中杯数学建模A题太阳能路灯光伏板的朝向设计问题解题全过程文档及程序