C# Task 的用法

其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观。代码更简洁了,使用Task来进行操作。可以跟线程一样可以轻松的对执行的方法进行控制。

顺便提一下,配合CancellationTokenSource类更为可以轻松的对Task操作的代码进行中途终止运行,会在后面的章节中讲述。

如果我们使用线程池来实现某几个方法运行,然后等待运行完成的大概会编写如下代码:

using(ManualResetEvent m1 =newManualResetEvent(false))

using(ManualResetEvent m2 =newManualResetEvent(false))

{

ThreadPool.QueueUserWorkItem(delegate

{

MyMethodA();

m1.Set();

});

ThreadPool.QueueUserWorkItem(delegate

{

MyMethodB();

m2.Set();

});

WaitHandle.WaitAll(newWaitHandle[]{ m1, m2,});

}

如果用Task类的话,相对就比较简单了,至少代码看起来很舒服。也就意味着维护也比较方便

Task t1 =Task.Factory.StartNew(delegate{MyMethodA();});

Task t2 =Task.Factory.StartNew(delegate{MyMethodB();});

t1.Wait();

t2.Wait();

上面的方法是一个一个的执行完毕,获取不是我们想要的,我们一般是想要他们一起同时执行,提高程序处理事情的效率。

Task t1 =Task.Factory.StartNew(delegate{MyMethodA();});

Task t2 =Task.Factory.StartNew(delegate{MyMethodB();});

Task.WaitAll(t1, t2);

下面我们来简单介绍下Task的用法

创建 Task

创建Task有两种方式,一种是使用构造函数创建,另一种是使用 Task.Factory.StartNew 进行创建。如下代码所示

1.使用构造函数创建Task

Task t1 =newTask(MyMethod);

2.使用Task.Factory.StartNew 进行创建Task

Task t1 =Task.Factory.StartNew(MyMethod);

其实这两种方式都是一样的,Task.Factory 是对Task进行管理,调度管理这一类的。好学的伙伴们,可以深入研究。这不是本文的范畴,也许会在后面的文章细说。

运行 Task

运行Task的两种方式,在上面我们已经提到过了,一种等待运行完毕,另一种则等待所有运行完毕。不过这里还有一种就是异步运行,跟使用多线程一样,调用Task对象中的Start()方法即可。看看下面这个控制台示例。纯粹是Wait和AllWait的话,仅仅是等待。而不是执行。所以我们还需要调用Start()方法

staticvoidMain(string[] args)

{

Task t1 =newTask(MyMethod);

t1.Start();

Console.WriteLine("主线程代码运行结束");

Console.ReadLine();

}

staticvoidMyMethod()

{

for(int i =0; i <5; i++)

{

Console.WriteLine(DateTime.Now.ToString());

Thread.Sleep(1000);

}

}

运行效果如图

因为我们没有调用Wait 所以是异步执行的~

取消Task

我们一开始就描述了 CancellationTokenSource 这个对象对Task的取消运行。一般是用不到这个方法的,一般会正常的退出所运行的代码,如使用 bool IsExit 之类的来进行一个控制。而不是中途强制中断代码。

可以参考我的这篇文章:http://www.wxzzz.com/643.html

至于 CancellationTokenSource 控制Task,下一篇文章会进行详细的一个介绍。

Task的异常处理

因为Task中是异步执行,你也可以理解为跟多线程一样,具体错误捕获需要自己去捕获。很有意思的是Task的异常还会重新抛到Wait和AllWait中,我们可以进行方便的捕获这些异常。如下代码

staticvoidMain(string[] args)

{

Task t1 =newTask(MyMethod);

t1.Start();

t1.Wait();

Console.WriteLine("主线程代码运行结束");

Console.ReadLine();

}

staticvoidMyMethod()

{

thrownewException("Task异常测试");

}

运行效果如图

获取 Task 的返回值

先看看代码

Task t1 =Task.Factory.StartNew(()=>"测试");

t1.Wait();

Console.WriteLine(t1.Result);

Console.ReadLine();

返回值可以是任意的类型,因为是个泛型嘛~ 还是依然的非常简洁的代码。

至此,就是 C# Task 的相关用法了,欢迎回复讨论。

原文转自:http://www.wxzzz.com/683.html

原作者为 王旭

。请尊重原作者版权

SSIS Execute SQL Task 用法

Execute Sql Task组件是一个非常有用的Control Flow Task,可以直接执行SQL语句,例如,可以执行数据更新命令(update,delete,insert),也可以执行sel ...

verilog之task用法实例

该用法的代码源自夏宇闻老师的教材. 源代码: module traffic_lights; reg clock, red, amber, green; , off = , red_tics = , a ...

C&num; Task用法

1.Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: ◆ ThreadPool不支持线程的取消.完成.失败通知等交互性 ...

Task用法(2)-任务等待wait

1.Wait 用法   默认情况下,Task 是有线程池中的异步线程执行,是否执行完成,可以通过Task的的属性IsCompleted 来判断,  如果想在子线程工作完成之后,在进行后续主线程工作可以 ...

verilog中的task用法

任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要 ...

verilog 中task用法

1.任务定义  任务定义的形式如下:  task task_id;      [declaration]      procedural_statement  endtask  其中,关键词 task ...

Task用法(1)-启动方法

第一.基本使用 Thread,ThreadPool,Task的区别 Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread ...

Task用法

转: https://www.cnblogs.com/wyy1234/p/9172467.html

随机推荐

js 小数格式化函数

直接上代码,参数number为待格式化整数或小数,fix是要保留有效位数,过亿以亿结尾,过万以万结尾,toFixed函数记得,免得再查 function shorten_number (number, ...

MVVM模式

MVVM的最大缺点貌似是,报错后不好找, 在安卓6.0的时候出现了一个工具叫做databinding,其中呢主要是用来帮助实现MVVM模式的快速开发   在使用databinding的时候我们需要做的 ...

python生成器之斐波切纳数列

面试的时候遇到过这样的一个题目: 斐波切纳数列1,2,3,5,8,13,21.........根据这样的规律,编程求出400万以内最大的斐波切纳数,并求出是第几个斐波切纳数. 方法一: 方法二:这个方 ...

【Web探索之旅】第二部分第五课:响应式网站和移动应用

内容简介 1.第二部分第五课:响应式网站和移动应用 2.第三部分第一课预告:服务器 第二部分第五课:响应式网站和移动应用 在我们开始聊响应式网站之前,我们可以聊聊移动App(App是Applicati ...

纳税服务系统【信息发布管理、Ueditor、异步信息交互】

需求分析 我们现在来到了纳税服务系统的信息发布管理模块,首先我们跟着原型图来进行需求分析把: 一些普通的CRUD,值得一做的就是状态之间的切换了.停用和发布切换. 值得注意的是:在信息内容中,它可以带 ...

python列表的操作

1.列表的增加: li=[] li.append("hha") print(li) li=[] li.append("hha") print(li) li.in ...

BZOJ&lowbar;2242&lowbar;&lbrack;SDOI2011&rsqb;计算器&lowbar;快速幂&plus;扩展GCD&plus;BSGS

BZOJ_2242_[SDOI2011]计算器_快速幂+扩展GCD+BSGS 题意: 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p, ...

原生JS实现简易评论更新功能

...

弹性盒模型,flex布局

弹性盒模型   弹性盒子是css3的一种新布局模式,由容器(父元素)和项目(子元素)组成. 弹性盒子是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式. 引入弹性盒模型的 ...

不同数据库下的web&period;config中数据库连接字符串

C语言task的用法,C# Task 用法相关推荐

  1. C语言中task的用法,C# Task详解

    C# Task详解  https://www.cnblogs.com/zhaoshujie/p/11082753.html 1.Task的优势 ThreadPool相比Thread来说具备了很多优势, ...

  2. 【转】1.DThread、ThreadPool、Task、Parallel的基本用法、区别以及弊端

    多线程的操作在程序中也是比较常见的,比如开启一个线程执行一些比较耗时的操作(IO操作),而主线程继续执行当前操作,不会造成主线程阻塞.线程又分为前台线程和后台线程,区别是:整个程序必须要运行完前台线程 ...

  3. python语言入门n-python语言入门之字符串的一些用法

    本篇教程探讨了python语言入门之字符串的一些用法,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 一.字符串的拼接: a="123' b="ab ...

  4. C语言删掉无关变量无输出,C语言变量类型与输出控制用法实例教程

    本文实例讲述了C语言变量类型与输出控制用法,有助于读者很好的对其进行总结与归纳.该实例分享给大家供大家参考借鉴之用.具体如下: 完整实例代码如下: /************************* ...

  5. channelinactive触发后不关闭channel_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作...

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  6. java case用法_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  7. c语言(vd6.0) sleep函数用法 及delay用法

    c语言(vd6.0) sleep函数用法 及delay用法 悬赏分:20 | 解决时间:2009-5-20 20:56 | 提问者:杨筱硕 请注明头文件 2个函数都要举例 最佳答案 1.函数名: de ...

  8. c语言数据类型int的用法,C语言基本数据类型:整型(int)用法详解|C语言学习

    C语言基本数据类型:整型(int)用法详解 1. 整型 int C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int 是整型之一,一般被称为整型.以后, ...

  9. 对C语言的关键字及部分关键字用法的简单理解

    小盆友,你是否有很多问号??? C语言的关键字是什么?有哪些?他们如何用??? 我也在学习中迷惑着,所以把今天学习到的稍微做一下总结,方便自己以后的复习(目前学到的比较粗浅,以后还需要深入学习). 哪 ...

最新文章

  1. 数据分析师必看:5大概率分布,你了解多少?
  2. linux mysql5.1安装,1怎么安装?Linux环境下MySQL5?
  3. oracle 11g ORA-12514
  4. 吴恩达机器学习笔记61-应用实例:图片文字识别(Application Example: Photo OCR)【完结】...
  5. pythonisalpha函数计算公式_常用python实现.ipynb
  6. 成为软件架构师的4个过程
  7. linux rs232触摸屏驱动程序,Linux下的触摸屏驱动
  8. Linq to SQL只支持SQL Server(所选对象使用不支持的数据提供程序)
  9. Facebook发布基站开源平台OpenCellular
  10. 易语言c调用,易语言调用C++编写的DLL
  11. python tensorflow 智能家居_用GPU加速深度学习: Windows安装CUDA+TensorFlow教程
  12. jdk7 HashSet和HashMap源码分析
  13. stm32学习笔记——电容触摸按键的实现
  14. 各种常见数据传输线端口(插头)的分类
  15. 飞天云动能否一飞冲天?
  16. 怎么将两台计算机ping接通,小编教你手把手教你一根网线连接两台电脑实现数据传送...
  17. c语言单片机红外报警设计,超级简单单片机红外感应开关DIY设计
  18. 蚌埠、黄石乐高授权专卖店开业;保乐力加中国积极助力2021全国理性饮酒宣传周 | 知消...
  19. 我的博客 http://aofengblog.blog.163.com/
  20. android 获取摄像头像素

热门文章

  1. 影创科技助力云南首例MR混合现实肝脏手术成功实施
  2. 906007-10-1,Azide-PEG6-Tos叠氮化物(N3)基团可以通过点击化学与炔烃、BCN、DBCO反应
  3. Python实现统一社会信用代码合法性校验
  4. chatgpt平替,清华chatglm本地化部署教程(aigc大模型风口,校招找工作必备),包含weiui部署,api部署,对话框部署
  5. Java:Java实现简单闹钟设计
  6. nginx worker shutting down状态超时退出配置
  7. 开源网安实现高效、高精度的静态应用安全检测 -CodeSec
  8. ionic platform add android环境搭建之难产【i1】【小白-2016.11.5】
  9. Email营销相关名词解释:PEM,UCE,Opt-in,Double Opt-In,Opt-out
  10. hackerrank初级篇之staircase