C# 任务的异常和延续处理

写在前面

当Task在执行过程中出现异常或被取消等例外的情况时,为了让执行流程能够继续进行,可以使用延续方法实现这种链式处理;还可以针对前置任务不同的执行结果,选择执行不同的延续分支方法。子任务执行过程中的任何异常都会被传递到延续方法中进行统一处理,因此而增强了对并行任务的流程控制。

代码实现

cs 复制代码
        public static void ContinueWithException()
        {
            TaskCreationOptions tco = TaskCreationOptions.AttachedToParent;
            Task task = Task.Factory.StartNew(() =>
            {
                Task.Factory.StartNew(() => { throw new Exception(Environment.NewLine + "first exception" + Environment.NewLine); }, tco);
                Task.Factory.StartNew(() => { throw new Exception(Environment.NewLine + "second exception" + Environment.NewLine); }, tco);
                Task.Factory.StartNew(() => { throw new Exception(Environment.NewLine + "third exception" + Environment.NewLine); }, tco);
            }).ContinueWith(t => Console.WriteLine("Message:" + t.Exception.Message + Environment.NewLine), TaskContinuationOptions.OnlyOnFaulted);
            task.Wait();


            Task task01 = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("task01 executed.");
            });
            Task ok1 = task01.ContinueWith(t => Console.WriteLine("Ok"), TaskContinuationOptions.NotOnFaulted);
            Task fail1 = task01.ContinueWith(t => Console.WriteLine("Failure:" + t.Exception.Message), TaskContinuationOptions.OnlyOnFaulted);

            Task task02 = Task.Factory.StartNew(() =>
            {
                throw new Exception("task02 executed.");
            });
            Task ok2 = task02.ContinueWith(t => Console.WriteLine("Ok"), TaskContinuationOptions.NotOnFaulted);
            Task fail2 = task02.ContinueWith(t => Console.WriteLine("Failure:" + t.Exception.Message), TaskContinuationOptions.OnlyOnFaulted);

        }

调用结果

如图,子任务中分别抛出的三个异常信息都被传递到了延续方法中,程序依然可以继续执行;另外task01和task02分别根据执行情况进入了不同的延续分支方法。

相关推荐
A_aspectJ7 分钟前
【Java基础开发】 基于Swing GUI 组件实现图书管理系统
java·开发语言
xyq202422 分钟前
Font Awesome 加载中图标
开发语言
踩着两条虫42 分钟前
VTJ 平台六大设计模式落地实战指南
开发语言·前端·人工智能·低代码·设计模式·重构·架构
isNotNullX1 小时前
数据大屏怎么做?数据大屏有哪四个核心环节
开发语言·前端·javascript
Hello eveybody1 小时前
介绍最大公因数和最小公约数(C++)
java·开发语言·c++
ckhcxy1 小时前
抽象类和接口
java·开发语言
我头发多我先学1 小时前
C++ AVL 树:平衡原理到完整实现(自平衡二叉搜索树)
开发语言·数据结构·c++·算法
@小柯555m1 小时前
算法(字母异位词分组)
java·开发语言·算法·leetcode
故事和你911 小时前
洛谷-算法2-1-前缀和、差分与离散化2
开发语言·数据结构·算法·深度优先·动态规划·图论
郝学胜-神的一滴1 小时前
epoll 边缘触发 vs 水平触发:从管道到套接字的深度实战
linux·服务器·开发语言·c++·网络协议·unix