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 ...
随机推荐
- 32-bit Assembly on x86_64 Linux (Use Nasm and ld&gcc)
Assembly on x86_64 Linux Some instructions in Intel assembly set are invalid in x86_64 env. e.g. aaa ...
- ComboBox的数据联动
实现效果: 点击年级下拉框值时,获取科目下拉框值 一:加载年级下拉框值 GradeDAL层: //检索所有年级名称集合,返回的是泛型集合List<Grade> public List< ...
- AC日记——计算2的N次方 openjudge 1.6 12
12:计算2的N次方 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N. 输出 输出2的N次方 ...
- .NET(C#) File类的常用方法
MSDN的File类 File类在MSDN:https://msdn.microsoft.com/zh-cn/library/system.io.file_methods(v=vs.110).aspx ...
- 2016年秋季的我,work with hololens
- [Flex] flex手机项目如何限制横竖屏?只允许横屏?
flex手机项目如何限制横竖屏?只允许横屏? 有人知道吗?求教.. 工程中 xxx-app.xml 找到</aspectRatio> 去掉注释 修改为<aspectRatio&g ...
- uva216 Getting in Line
Computer networking requires that the computers in the network be linked. This problem considers a \ ...
- JavaScript的闭包和内存泄漏问题
闭包 http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html JavaScript中必须提到的功能最强大的抽象 ...
- ASP.NET MVC读取XML并使用ViewData显示
看到网上一个网友问及,无法获取XML某一个节点内容.下面Insus.NET在ASP.NET MVC环境下实现它. 先把XML文件放入App_Data目录,当然你可以放在自建目录中.打开看看它有几层,几 ...
- Scrapy 爬虫
Scrapy 爬虫 使用指南 完全教程 scrapy note command 全局命令: startproject :在 project_name 文件夹下创建一个名为 project_name ...