C# Task 用法
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<string> t1 =Task.Factory.StartNew(()=>"测试");
- t1.Wait();
- Console.WriteLine(t1.Result);
- Console.ReadLine();
返回值可以是任意的类型,因为是个泛型嘛~ 还是依然的非常简洁的代码。
至此,就是 C# Task 的相关用法了,欢迎回复讨论。
C# Task 用法
。请尊重原作者版权
C# Task 用法的更多相关文章
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- 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# 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 ...
- C# 基础 之:Task 用法
参考来源:https://www.cnblogs.com/zhaoshujie/p/11082753.html 他介绍的可以说是非常详细,附带Demo例子讲解 1.入门 Task看起来像一个Threa ...
随机推荐
- Struts2中的Unable to load configuration错误的分析与解决方法
当我们遇到 Unable to load configuration. 这样的错误时,可以根据具体的错误提示找出错误的原因. Unable to load configuration. - inter ...
- 【2016-10-13】【坚持学习】【Day4】【模板方法模式】
今天学习模板方法模式 例子代码; 模板抽象类,定义了一套流程,有一些方法已经实现,有一些抽象方法需要继承它的子类实现 abstract class DataViewer { //抽象方法:获取数据 p ...
- BNUOJ 52325 Increasing or Decreasing 数位dp
传送门:BNUOJ 52325 Increasing or Decreasing题意:求[l,r]非递增和非递减序列的个数思路:数位dp,dp[pos][pre][status] pos:处理到第几位 ...
- zookeeper Eclipse 开发环境搭建及简单示例
一,下载Zookeeper安装包 从官方网站下载稳定版安装包后,解压. 其中ZK_HOME 为:D:\Program Files\zookeeper-3.4.9 二,启动Zookeeper Serve ...
- nginx集群报错“upstream”directive is not allow here 错误
nginx集群报错“upstream”directive is not allow here 错误 搭建了一个服务器, 采用的是nginx + apache(多个) + php + mysql(两个) ...
- win2008server R2 x64 部署.net core到IIS上出现【Failed to load the dll from [C:\Program Files\dotnet\host\fxr\1.0.1\hostfxr.dll], HRESULT: 0x80070057】错误
win2008server R2 x64 部署.net core到IIS上出现[Failed to load the dll from [C:\Program Files\dotnet\host\fx ...
- IOS之推送通知(本地推送和远程推送)
推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...
- Notes: Principles of fMRI 1 (Coursera)
course link: https://class.coursera.org/fmri1-001 Part 1 ❤ Three fundmental goals in fMRI: localiza ...
- Splay整理
伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.(来自百科) 伸展树的操作主要是
- css3 box-sizing属性
个人总结: 如果需要兼容IE6 IE7,使用content-box.现在流行bootstrap3,需注意它使用的是border-box. box-sizing属性可以为三个值之一:content-bo ...