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; }
        }
    }
}

 

posted @   skybirdzw  阅读(684)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示