一. 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. 线程开启类的返回值

             {
Task<string> task1 = Task.Factory.StartNew(() =>
{
Console.WriteLine("我是子线程哦");
return "ok";
});
task1.Wait();
Console.WriteLine("我是主线程,我要读取子线程task1的返回值为:{0}", task1.Result);
}

2.  线程延续类的返回值

             {
Task<int> task1 = Task.Run(() =>
{
Console.WriteLine("我是子线程1哦");
return ;
}); var task2 = task1.ContinueWith((t) =>
{
Console.WriteLine("我是子线程2哦"); //这里的t代表 task1
var num = t.Result + ;
return num.ToString();
}); task2.Wait();
Console.WriteLine("我是主线程,我要读取子线程task1的返回值为:{0}", task1.Result);
Console.WriteLine("我是主线程,我要读取子线程task2的返回值为:{0}", task2.Result);
}

3. 线程条件延续类

  {
Task<int> task1 = Task.Run(() =>
{
Console.WriteLine("我是子线程1哦");
return ;
});
Task<int> task2 = Task.Run(() =>
{
Console.WriteLine("我是子线程2哦");
return ;
}); var task = Task.WhenAny(new Task<int>[] { task1, task2 });
task.Wait(); //下面的值可能是1,也可能是2
Console.WriteLine("我是主线程,我要读取子线程task的返回值为:{0}", task.Result.Result);
}

二. 通用线程异常处理方案

1.  背景:我们想达到一个目的,当同时开启多个线程的时候,其中一个线程报错,不影响其他线程的执行,并且能把错误记下来。

2.   解决方案:多重try-catch,整个外侧主线程一个try-catch,然后线程执行业务再用一个try-catch包裹起来。

常规方式捕获异常:

             {
try
{
for (int i = ; i < ; i++)
{
string name = string.Format("name{0}", i);
var task = Task.Run(() =>
{
try
{
//模拟某个线程出错
if (name == "name2")
{
throw new Exception(string.Format("线程执行失败,i={0}", name));
}
else
{
Console.WriteLine(string.Format("线程执行执行成功,i={0}", name));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} });
taskList.Add(task);
}
Task.WaitAll(taskList.ToArray());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); }
}

运行结果:我们发现所有的线程均执行完毕,且name2执行失败,并捕获。

补充一下:通过 AggregateException 类来捕获异常。

             {
try
{
for (int i = ; i < ; i++)
{
string name = string.Format("name{0}", i);
var task = Task.Run(() =>
{
throw new Exception(string.Format("线程执行失败,i={0}", name));
});
taskList.Add(task);
}
Task.WaitAll(taskList.ToArray());
}
catch (AggregateException aes)
{
foreach (var item in aes.InnerExceptions)
{
Console.WriteLine(item.Message);
}
}
}

第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。的更多相关文章

  1. Spring Boot Web 自定义返回值(通用)

    在项目下新建common.entity包,包中包含两个文件Result数据类,ResultCode接口文件 Result.class @Data @NoArgsConstructor public c ...

  2. 【C# Task】 ValueTask/Task<TResult>

    概要 1.如果异步方法的使用者使用 Task.WhenAll 或 Task.WhenAny,则在异步方法中使用 ValueTask<T> 作为返回类型可能会产生高昂的成本.这是因为您需要使 ...

  3. .NET - Task.Run vs Task.Factory.StartNew

    翻译自 Stephen Toub 2011年10月24日的博文<Task.Run vs Task.Factory.StartNew>,Stephen Toub 是微软并行计算平台团队的首席 ...

  4. Java多线程-Callable的Future返回值的使用

    一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中: public interface Executor { void execute(Runnable comm ...

  5. ASP.NET Core中的Action的返回值类型

    在Asp.net Core之前所有的Action返回值都是ActionResult,Json(),File()等方法返回的都是ActionResult的子类.并且Core把MVC跟WebApi合并之后 ...

  6. Java线程:新特征-有返回值的线程

    http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...

  7. JAVAEE——SpringMVC第二天:高级参数绑定、@RequestMapping、方法返回值、异常处理、图片上传、Json交互、实现RESTful、拦截器

    1. 课前回顾 https://www.cnblogs.com/xieyupeng/p/9093661.html 2. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 ...

  8. ResponseBodyAdvice如何处理返回值是字符串的问题

    项目中使用ResponseBodyAdvice同一封装返回格式,对于一般的类型都没有问题,但是处理字符串时,遇到了类型转换的问题,debug一步一步跟踪,原来是对于字符串的ContentType是“t ...

  9. C#异步编程のTask模型返回值Task<TResult>应用

    文中所有Task<TResult>的返回值都是直接用task.result获取,这样如果后台任务没有执行完毕的话,主线程会等待其执行完毕,这样的话就和同步一样了(看上去一样,但其实awai ...

随机推荐

  1. RH2288V3服务器 硬件安装以及更换硬件

    滑道类型:L型滑道.可伸缩滑道.报轨 L型滑道:只适用于华为机柜. 准备工具:防静电带或者防静电手套.螺丝刀.浮动螺母安装条. 安装服务器步骤: 1.安装L型滑道   2.安装浮动螺母  3.安装服务 ...

  2. Docker: Harbor一些小知识

    镜像文件上传到私有仓库harbor后,镜像的物理存储位置在哪里? 这些信息记录在docker-compose.yml里,通过观察发现 镜像存储在了宿主机的 volumes: - /data/regis ...

  3. MySQL 数据表创建及管理

    use stuinfo; -- 指定当前数据库 CREATE table if not exists student1( -- 创建数据表student1 sNo ) not NULL, sName ...

  4. Configuring High Availability and Consistency for Apache Kafka

    To achieve high availability and consistency targets, adjust the following parameters to meet your r ...

  5. ZooKeeper学习总结 第一篇:ZooKeeper快速入门

    1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 它有如下的一些特点: 简单 Zookeeper的核 ...

  6. Linux运维期中架构(50台集群)

    一.期中架构 二.期中架构-前端部分 三.第三阶段作业-期中架构

  7. Ubuntu 下重启网络的方法

    命令是: sudo /etc/init.d/networking restart 但是可能会遇到下面的提示: Running /etc/init.d/networking restart is dep ...

  8. 分布式任务调度平台XXL-JOB搭建教程

    关于分布式任务调度平台XXL-JOB,其实作者 许雪里 在其发布的中文教程中已经介绍的很清楚了,这里我就不做过多的介绍了,关于其搭建教程,本人依照其文档搭建起来基本上也没遇到啥问题,这里通过博客的形式 ...

  9. 聊聊计算机中的编码(Unicode,GBK,ASCII,utf8,utf16,ISO8859-1等)以及乱码问题的解决办法

    作为一个程序员,一个中国的程序员,想来“乱码”问题基本上都遇到过,也为之头疼过.出现乱码问题的根本原因是编码与解码使用了不同而且不兼容的“标准”,在国内一般出现在中文的编解码过程中. 我们平时常见的编 ...

  10. iOS开发基础-九宫格坐标(3)之Xib

    延续iOS开发基础-九宫格坐标(2)的内容,对其进行部分修改. 本部分采用 Xib 文件来创建用于显示图片的 UIView 对象. 一.简单介绍  Xib 和 storyboard 的比较: 1) X ...