博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#Task类。实现异步的一种方式
阅读量:5213 次
发布时间:2019-06-14

本文共 2773 字,大约阅读时间需要 9 分钟。

Task和Task
是c#提供的一种实现异步功能的2个类。Task
继承Task类,有返回参数。
1、基本用法 不嵌套 利用静态方法创建和运行任务:
//无返回参数,Action委托作为参数。有参数,无返回值Task.Run( ()=>{                                //Action委托Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");});//有返回参数,func委托作为参数。有参数,有返回值Task
t=Task.Run
(()=>{ //Func
委托string str="有参任务"return str;});//开启另一个任务等待完成,并输出结果Task cwt = t.ContinueWith(m => {     Console.WriteLine("任务完成后的执行结果:{0}", m.Result.ToString());//Action
>委托,m代表mycaller即调用者,在这里m=t.  });
利用构造函数创建和执行任务:

 

//此处只说明有返回值情况      Task
t = new Task
(() => {  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
parent = new Task
(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: }

  

 

转载于:https://www.cnblogs.com/crhdyl/p/4900449.html

你可能感兴趣的文章
js知识梳理3:创建对象的模式探究
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
cookies相关概念
查看>>
angular2 formsModule 双向数据绑定
查看>>
android动态权限获取
查看>>
CAN总线波形中ACK位电平为什么会偏高?
查看>>
siebel 中 join 使用心得
查看>>
剑指Offer:重建二叉树
查看>>
MyBatis课程2
查看>>
css属性之统一设置文本及div之间的对齐方式
查看>>
PHP大批量更新数据,大批量插入数据,mysql批量更新与插入多种方法
查看>>
[转]如何循序渐进向dotnet架构师发展
查看>>
桥接模式-Bridge(Java实现)
查看>>
dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算(终结版)
查看>>
java面试题之hashcode相等两个类一定相等吗?equals呢?相反呢?
查看>>
[leetcode]Generate Parentheses
查看>>
常用的原生js兼容函数收集
查看>>
Python repr() 或str() 函数
查看>>
3.数据类型1
查看>>
可持久化线段树
查看>>