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 ...
随机推荐
- 大话设计模式C++版——抽象工厂模式
前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...
- linux下yum命令出现Loaded plugins: fastestmirror
yum install的时候提示:Loaded plugins: fastestmirror fastestmirror是yum的一个加速插件,这里是插件提示信息是插件不能用了. 不能用就先别用呗,禁 ...
- NopCommerce 关于Customer的会员类别及会员价处理 的尝试途径
示例效果: 当Customer是某个会员级别或内部员工时, 购物结算时享受一定的折扣: 相关设定如下: Step1.新增会员类别 Admin - Customers - Customer rol ...
- 阻塞通信之Socket编程
Socket通信,主要是基于TCP协议的通信.本文从Socket通信(代码实现).多线程并发.以及TCP协议相关原理方面 介绍 阻塞Socket通信一些知识. 本文从服务器端的视角,以“Echo Se ...
- CF721C. Journey[DP DAG]
C. Journey time limit per test 3 seconds memory limit per test 256 megabytes input standard input ou ...
- Unity热门插件推荐
前言 Unite2015的笔记 ,本文所提到的扩展主要针对 mobile上使用. 文中资源在Asset Store描述的截图日期:2016-04-28 Mesh Baker https://www.a ...
- 穷举、迭代、以及while代替for循环的使用
for循环的穷举: 就是所有情况走一遍,使用if筛选出符合的情况. while循环分为2个格式 (1)先判断再做while(){}(2)不管对错,先做了在判断do{}whlie() 百鸡百钱的whil ...
- [No000031]操作系统 Operating Systems 之Open the OS!
从打开电源开始… 这神秘的黑色背后发生着什么?… 打开电源,计算机执行的第一句指令什么? 计算模型(图灵机) ⇒ 我们要 关注 指针IP 及其 指向的内容 看看x86 PC (1) 刚开机时CPU 处 ...
- EntityFramework Core 封装
public class EntityBaseRepository<T> : IEntityBaseRepository<T> where T : class, IEntity ...
- Kali linux渗透测试常用工具汇总1
1.ProxyChains 简介:代理工具.支持HTTP/SOCKS4/SOCK5的代理服务器,允许TCP/DNS通过代理隧道. 应用场景:通过代理服务器上网. 配置:/etc/proxychains ...