欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 使用CancellationTokenSource来控制长时间sql查询中断

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

2025/2/7 0:12:19 来源:https://blog.csdn.net/wyh2943455568/article/details/144290642  浏览:    关键词:使用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(); // 请求取消}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com