c#Task类。实现异步的一种方式
Task和Task<TResult>是c#提供的一种实现异步功能的2个类。Task<TResult>继承Task类,有返回参数。
1、基本用法 不嵌套
利用静态方法创建和运行任务:
//无返回参数,Action委托作为参数。有参数,无返回值
Task.Run( ()=>{ //Action委托
Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");
});
//有返回参数,func委托作为参数。有参数,有返回值
Task<string> t=Task.Run<string>(()=>{ //Func<TResult>委托
string str="有参任务"
return str;
});
//开启另一个任务等待完成,并输出结果
Task cwt = t.ContinueWith(m => {
Console.WriteLine("任务完成后的执行结果:{0}", m.Result.ToString());
//Action<Task<TResult>>委托,m代表mycaller即调用者,在这里m=t.
});
利用构造函数创建和执行任务:
//此处只说明有返回值情况
Task<int> t = new Task<int>(() => {
int sum=0;
Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");
for (int i = 0; i < 10; i++)
{
sum =+ i;
}
return sum;
});
//启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler) t.Start();
//等待任务的完成执行过程。这里有两种方法,一种,使用已创建任务的Wait方法。会在这里形成阻塞
t.Wait();
【另一种不会形成阻塞的方法:使用已创建任务的ContinueWith方法。作用:任务完成后,再开启另外一个任务,对结果进行处理。 Task cwt = t.ContinueWith(m => {
Console.WriteLine("任务完成后的执行结果:{0}", m.Result.ToString());
});
】
//获得任务的执行结果
Console.WriteLine("任务执行结果:{0}", t.Result.ToString());
2、任务嵌套。父任务,子任务。
通过Task类创建的任务是顶级任务,可以通过使用 TaskCreationOptions.AttachedToParent 标识把这些任务与创建他的任务相关联,所有子任务全部完成以后父任务才会结束操作。示例如下:
1: static void ParentChildTask() {
2: Task<string[]> parent = new Task<string[]>(state => {
3: Console.WriteLine(state);
4: string[] result=new string[2];
5: //创建并启动子任务
6: new Task(() => { result[0]= "我是子任务1。"; },TaskCreationOptions.AttachedToParent).Start();
7: new Task(() => { result[1] = "我是子任务2。"; }, TaskCreationOptions.AttachedToParent).Start();
8: return result;
9: },"我是父任务,并在我的处理过程中创建多个子任务,所有子任务完成以后我才会结束执行。");
10: //任务处理完成后执行的操作
11: parent.ContinueWith(t => {
12: Array.ForEach(t.Result, r=>Console.WriteLine(r));
13: });
14: //启动父任务
15: parent.Start();
16: Console.Read();
17: }
如果需要创建一组具有相同状态的任务时,可以使用TaskFactory类或TaskFactory<TResult>类。这两个类创建一组任务时可以指定任务的CancellationToken、TaskCreationOptions、TaskContinuationOptions和TaskScheduler默认值。示例代码:
1: static void TaskFactoryApply()
2: {
3: Task parent = new Task(() =>
4: {
5: CancellationTokenSource cts = new CancellationTokenSource(5000);
6: //创建任务工厂
7: TaskFactory tf = new TaskFactory(cts.Token, TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
8: //添加一组具有相同状态的子任务
9: Task[] task = new Task[]{
10: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第一个任务。"); }),
11: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第二个任务。"); }),
12: tf.StartNew(() => { Console.WriteLine("我是任务工厂里的第三个任务。"); })
13: };
14: });
15: parent.Start();
16: Console.Read();
17: }
c#Task类。实现异步的一种方式的更多相关文章
- 第四节:Task的启动的四种方式以及Task、TaskFactory的线程等待和线程延续的解决方案
一. 背景 揭秘: 在前面的章节介绍过,Task出现之前,微软的多线程处理方式有:Thread→ThreadPool→委托的异步调用,虽然也可以基本业务需要的多线程场景,但它们在多个线程的等待处理方面 ...
- C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌
1. IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...
- C#中关于增强类功能的几种方式
C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的 ...
- js处理异步的几种方式
Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推) ...
- 原生javascript实现异步的7种方式
1.$(document).ready 点评: 需要引用jquery :兼容所有浏览器. 2.标签的async=”async”属性 async的定义和用法(是HTML5的属性) async 属性规定一 ...
- Js 类定义的几种方式
提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...
- Java反射获取类对象的三种方式
package demo01; /* * 获取一个类的class文件对象的三种方式 * 1.对象获取 * 2.类名获取 * 3.Class类的静态方法获取 */ public class Reflec ...
- JavaScript 创建类/对象的几种方式
在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它允许你通过变量 ...
- tkinter 类继承的三种方式
tkinter class继承有三种方式. 提醒注意这几种继承的运行方式 一.继承 object 1.铺tk.Frame给parent: 说明: self.rootframe = tk.Frame(p ...
随机推荐
- “undefined JNI_GetCreatedJavaVM”和“File format not recognized”错误原因分析
如果编译时,报如下所示错误:../../third-party/hadoop/lib/libhdfs.a(jni_helper.c.o): In function `getGlobalJNIEnv': ...
- linux每天一小步---find命令详解
1 命令功能 find命令用于搜索指定目录下的文件,并配合参数做出相应的处理. 2 命令语法 find 搜索路径pathname 选项option [-exec -ok -print 执 ...
- Monocular Visual-Inertial Odometry单目视觉惯性里程计
Monocular Visual-Inertial Odometry:https://www.qualcomm.com/invention/research 单目视觉-惯性里程计 INDOOR POS ...
- Navicet Mysql数据库电脑本地备份
Navicet Mysql数据库电脑本地备份 1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业" ...
- Hdu1874 畅通工程续 2017-04-12 18:37 48人阅读 评论(0) 收藏
畅通工程续 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
- java中时间
格式转化 SimpleDateFormat package day1211.common; import java.sql.Date;import java.sql.Timestamp;import ...
- 类数组对象 实参对象arguments
先看实参对象arguments 之前对argument有点印象,知道它不是真正的数组,但也可以arguments[0]和arguments.length.今天详细的记录一下. js的默认行为:省略的实 ...
- 我的第一个博客&GuiHub简单练习
个人介绍 姓名:马瑞 性别:男 班级:网络工程143 出生年月:1995.11 兴趣爱好:玩玩电脑,看看动漫. 编程能力:完全是菜鸟. GutHub的使用体验: 第一步:注册github,这很简 ...
- set 集合数据类型
set 数据类型 set 与列表类似,区别在于 set 不能包含重复的值. In [1]: a_list = ['a', 'b', 'c', 'b', 'd', 'm', 'n', 'n'] In [ ...
- Git 教程 -- 基于自己学习记录
Git 教程 -- 基于自己学习记录 1. 引言 由于学校布置了一项熟悉 git 和 svn 操作的实验,所以自己重新温习了下 git,记录过程在这. 2. 注册登录 GitHub. 3. 选择一个仓 ...