第八节:Task的各类TaskTResult返回值以及通用线程的异常处理方案。
一. Task的各种返回值-Task<TResult>
PS: 在前面章节,我们介绍了Task类开启线程、线程等待、线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的Task<TResult>,然后可以通过Task的实例调用Result属性来获取这个返回值。
下面我们分三类来介绍:
①:线程开启类的返回值, 使用Task<TResult>接受,或者直接使用Task接受,通过 实例.Result 来获取返回值。这里的线程开启类有多种,eg: Task.Run()、 task.start()、 Task.Factory.StartNew() 等。
②:线程延续类的返回值. eg:ContinueWith。
③:线程条件延续类的返回值. eg:WhenAll和WhenAny。
1. 线程开启类的返回值
1 {
2 Task<string> task1 = Task.Factory.StartNew(() =>
3 {
4 Console.WriteLine("我是子线程哦");
5 return "ok";
6 });
7 task1.Wait();
8 Console.WriteLine("我是主线程,我要读取子线程task1的返回值为:{0}", task1.Result);
9 }
2. 线程延续类的返回值
1 {2 Task<int> task1 = Task.Run(() =>3 {4 Console.WriteLine("我是子线程1哦");5 return 2;6 });7 8 var task2 = task1.ContinueWith((t) =>9 {
10 Console.WriteLine("我是子线程2哦");
11
12 //这里的t代表 task1
13 var num = t.Result + 2;
14 return num.ToString();
15 });
16
17 task2.Wait();
18 Console.WriteLine("我是主线程,我要读取子线程task1的返回值为:{0}", task1.Result);
19 Console.WriteLine("我是主线程,我要读取子线程task2的返回值为:{0}", task2.Result);
20 }
3. 线程条件延续类
1 {2 Task<int> task1 = Task.Run(() =>3 {4 Console.WriteLine("我是子线程1哦");5 return 1;6 });7 Task<int> task2 = Task.Run(() =>8 {9 Console.WriteLine("我是子线程2哦");
10 return 2;
11 });
12
13 var task = Task.WhenAny(new Task<int>[2] { task1, task2 });
14 task.Wait();
15
16 //下面的值可能是1,也可能是2
17 Console.WriteLine("我是主线程,我要读取子线程task的返回值为:{0}", task.Result.Result);
18 }
二. 通用线程异常处理方案
1. 背景:我们想达到一个目的,当同时开启多个线程的时候,其中一个线程报错,不影响其他线程的执行,并且能把错误记下来。
2. 解决方案:多重try-catch,整个外侧主线程一个try-catch,然后线程执行业务再用一个try-catch包裹起来。
常规方式捕获异常:
1 {2 try3 {4 for (int i = 0; i < 5; i++)5 {6 string name = string.Format("name{0}", i);7 var task = Task.Run(() =>8 {9 try
10 {
11 //模拟某个线程出错
12 if (name == "name2")
13 {
14 throw new Exception(string.Format("线程执行失败,i={0}", name));
15 }
16 else
17 {
18 Console.WriteLine(string.Format("线程执行执行成功,i={0}", name));
19 }
20 }
21 catch (Exception ex)
22 {
23 Console.WriteLine(ex.Message);
24 }
25
26 });
27 taskList.Add(task);
28 }
29 Task.WaitAll(taskList.ToArray());
30 }
31 catch (Exception ex)
32 {
33 Console.WriteLine(ex.Message);
34
35 }
36 }
运行结果:我们发现所有的线程均执行完毕,且name2执行失败,并捕获。
补充一下:通过 AggregateException 类来捕获异常。
1 {2 try3 {4 for (int i = 0; i < 5; i++)5 {6 string name = string.Format("name{0}", i);7 var task = Task.Run(() =>8 {9 throw new Exception(string.Format("线程执行失败,i={0}", name));
10 });
11 taskList.Add(task);
12 }
13 Task.WaitAll(taskList.ToArray());
14 }
15 catch (AggregateException aes)
16 {
17 foreach (var item in aes.InnerExceptions)
18 {
19 Console.WriteLine(item.Message);
20 }
21 }
22 }
第八节:Task的各类TaskTResult返回值以及通用线程的异常处理方案。相关推荐
- 第八节:Task的各类TaskTResult返回值以及通用线程的异常处理方案
一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...
- c# 使用多个TASK事务,等待返回值
在一个有返回值的方法中,我们启用三个事务分别处理数据,每个事务假设耗时为两秒,代码如下: private List<string> Test(){//事务列表List<Task< ...
- form表单ajax提交 ac,請求Ajax 帶返回值的通用方法, 自動獲取頁面控件值(form表單post方法提交 ),自動給控件賦值...
//自動獲取頁面控件值 function GetWebControls(element) { var reVal = ""; $(element).find('input,sele ...
- python多线程处理数据并获得子线程返回值
python多线程处理数据并获得子线程返回值 前言 python3中的多线程 用方法包装函数 用类包装函数 获取子线程返回值 从类中返回值 其他方法 前言 python中采用多线程方式处理大数据量的数 ...
- linux获取命令的返回值,Shell $?:获取函数返回值或者上一个命令的退出状态
$?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1,这和C ...
- Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法
函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...
- Thrift解读(五)——server端RPC接收与返回值的回送
Thrift框架主要分为四层:Service,Protocol,Transport,Server.前述介绍的TNonBlockingServer就是一种Server,除此之外,还有很多别的Server ...
- java开启线程的方法_Java有几种方法开启线程?怎么实现带有返回值的线程?
Java有几种方法开启线程?怎么实现带有返回值的线程? 发布时间:2020-05-22 11:20:08 来源:亿速云 阅读:238 作者:Leah Java有几种方法开启线程?怎么实现带有返回值的线 ...
- async js 返回值_图文讲解浏览器执行JS过程中的微任务和宏任务
背景 我们知道浏览器有一个特定的事件执行机制,专业名词叫做Event Loop.如下图所示,浏览器会优先执行同步代码,遇到异步的代码时,会被挂起并在需要执行的时候加入到 Task(有多种 Task) ...
最新文章
- FMDB支持的事务类型
- AI基础:机器学习的损失函数
- 收藏一个php用的一个页码按钮类
- 点击input框,添加阴影效果
- 数学入门题——《算法竞赛入门经典-训练指南》
- pythrch 启动 visdom可视化
- C#中如何跨窗体传值
- ValueError: This sheet is too large! Your sheet size
- hadoop中java部分练习_java私塾Hadoop实战-中高级部分 之 Hadoop RestFul
- 经纬度坐标相互转换度分秒
- 清除Windows虚机密码
- 51nod1679 连通率
- SM 2256K AB 无缓存量产工具
- windows 11 访问带SMB的文件服务器(小米路由器)
- 智慧城市专家指导东区项目
- PHP报错:414 Request-URI Too Large
- 亮考帮优秀作业计算机操作原理,对分课堂教学模式的“亮考帮”怎样在教案设计中分析体现...
- 2021的年终总结(仰望星空、脚踏实地)
- idea点击接口的方法的跳到实现类的快捷键
- 深圳考公务员计算机专业的试卷,2016公务员考试计算机专业模拟试题
热门文章
- Python format功能
- python执行gradle脚本
- Hadoop安装之JDK在Centos虚拟机中安装
- 网络攻防 第四周学习总结
- [Leetcode][第632题][JAVA][最小区间][堆][滑动窗口]
- python对象属性在引用时前面需要加()_python基础-面向对象进阶
- android 组件化_Android 组件化路由框架设计(仿Arouter)
- java数字不等于_java – 仅使用set中的数字查找等于或大于给定目标的总和
- html怎么在字体中加波浪线,CSS3实现文字波浪线效果
- 十二个球称三次C语言编程,十二个球,有一个不知轻重,现有一个天平,称三次,找出此球!...