Task取消以及异常处理
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { public class TaskCancelTest { //测试Task取消以及异常处理 public static void RunTest() { CancellationTokenSource cts = new CancellationTokenSource(); ParamCls paramCls = new ParamCls { token = cts.Token, n = 1000 }; //注意,此处调用多个参数的两种写法: Task<Int32> t = new Task< int >(() => OpWithParamIntAndReturnInt(cts.Token, 1000), cts.Token); Task<Int32> t1 = new Task< int >(o => OpWithParamIntAndReturnInt2((ParamCls)o), paramCls,cts.Token); t.Start(); //t1.Start(); //取消任务,这是一个异步操作,Task可能已经完成了 cts.Cancel(); try { //如果任务已经取消了,Result会抛出一个AggregateException Console.WriteLine( "The result is:" +t.Result.ToString()); } catch (AggregateException ex) { //将任何的OperationCanceledException对象都视为已处理。 //其他任何异常都造成抛出一个新的AggregateException,其中只包含未处理的异常。 ex.Handle(a => a is OperationCanceledException); //所有异常都处理好之后,执行下面这一行 Console.WriteLine( "The Task was canceled." ); } } private static Int32 OpWithParamIntAndReturnInt(CancellationToken ct, Int32 state) { Console.WriteLine( "In OpWithParamIntAndReturnInt,state=" + state.ToString()); //在取消标志引用的CancellationTokenSource上,如果调用Cancel,下面这一行会抛出OperationCanceledException ct.ThrowIfCancellationRequested(); Thread.Sleep(1000); return state; } private static Int32 OpWithParamIntAndReturnInt2(ParamCls paramCls) { Console.WriteLine( "In OpWithParamIntAndReturnInt2,state=" + paramCls.n.ToString()); //在取消标志引用的CancellationTokenSource上,如果调用Cancel,下面这一行会抛出OperationCanceledException paramCls.token.ThrowIfCancellationRequested(); Thread.Sleep(1000); return paramCls.n; } class ParamCls { public CancellationToken token { get ; set ; } public int n { get ; set ; } } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端