C# Task的用法
C# Task 的用法
其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观。代码更简洁了,使用Task来进行操作。可以跟线程一样可以轻松的对执行的方法进行控制。
顺便提一下,配合CancellationTokenSource类更为可以轻松的对Task操作的代码进行中途终止运行,会在后面的章节中讲述。
如果我们使用线程池来实现某几个方法运行,然后等待运行完成的大概会编写如下代码:
- using (ManualResetEvent m1 = new ManualResetEvent(false))
- using (ManualResetEvent m2 = new ManualResetEvent(false))
- {
- ThreadPool.QueueUserWorkItem(delegate
- {
- MyMethodA();
- m1.Set();
- });
- ThreadPool.QueueUserWorkItem(delegate
- {
- MyMethodB();
- m2.Set();
- });
- WaitHandle.WaitAll(new WaitHandle[] { 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 = new Task(MyMethod);
2.使用Task.Factory.StartNew 进行创建Task
- Task t1 = Task.Factory.StartNew(MyMethod);
其实这两种方式都是一样的,Task.Factory 是对Task进行管理,调度管理这一类的。好学的伙伴们,可以深入研究。这不是本文的范畴,也许会在后面的文章细说。
运行 Task
运行Task的两种方式,在上面我们已经提到过了,一种等待运行完毕,另一种则等待所有运行完毕。不过这里还有一种就是异步运行,跟使用多线程一样,调用Task对象中的Start()方法即可。看看下面这个控制台示例。纯粹是Wait和AllWait的话,仅仅是等待。而不是执行。所以我们还需要调用Start()方法
- static void Main(string[] args)
- {
- Task t1 = new Task(MyMethod);
- t1.Start();
- Console.WriteLine("主线程代码运行结束");
- Console.ReadLine();
- }
- static void MyMethod()
- {
- 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中,我们可以进行方便的捕获这些异常。如下代码
- static void Main(string[] args)
- {
- Task t1 = new Task(MyMethod);
- t1.Start();
- t1.Wait();
- Console.WriteLine("主线程代码运行结束");
- Console.ReadLine();
- }
- static void MyMethod()
- {
- throw new Exception("Task异常测试");
- }
运行效果如图

获取 Task 的返回值
先看看代码
- Task<string> t1 = Task.Factory.StartNew(() => "测试");
- t1.Wait();
- Console.WriteLine(t1.Result);
- Console.ReadLine();
返回值可以是任意的类型,因为是个泛型嘛~ 还是依然的非常简洁的代码。
C# Task的用法的更多相关文章
- C# Task 的用法
C# Task 的用法(转自:http://www.wxzzz.com/683.html#) 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来 ...
- 多线程 thread和Task的用法以及注意事项
并行 多核线程:Task 首先引用System.Threading; 1:用静态方法:Task.Factory.StartNew()来创建了一个最简单的Task: Task.Factory.Start ...
- Task 的用法
Task的功能喝Thread类似,写法也很简单: 两种方式: 第一 Task t1=new Task(()=>{}); t1.Start();//启动Task t1.Wait();//若调用Wa ...
- verilog中task的用法
任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要 ...
- 浅谈Task的用法
Task是用来实现多线程的类,在以前当版本中已经有了Thread及ThreadPool,为什么还要提出Task类呢,这是因为直接操作Thread及ThreadPool,向线程中传递参数,获取线程的返回 ...
- C#线程学习笔记七:Task详细用法
一.Task类简介: Task类是在.NET Framework 4.0中提供的新功能,主要用于异步操作的控制.它比Thread和ThreadPool提供了更为强大的功能,并且更方便使用. Task和 ...
- Task的用法
创建任务 无返回值的方式 方式1: var t1 = new Task(() => TaskMethod("Task 1")); t1.Start(); Task.WaitA ...
- C# Task 用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
- C# Task用法
1.Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: ◆ ThreadPool不支持线程的取消.完成.失败通知等交互性 ...
随机推荐
- Ueditor编辑器图片上传到万象优图
最近想用typecho做一个个人博客站,typecho的文本编辑器不能上传图片,我就用Ueditor替换的了原来的文本编辑器,听说腾讯的万象优图每月有50G的免费空间和流量,我就自己改了下Uedito ...
- 常用PHP array数组函数
array_rand 第二个参数用来确定要选出几个元素 如果选出的元素不止一个,则返回包含随机键名的数组,否则返回该元素的键名. $a=array("red","gre ...
- JQ多种刷新方式
下面介绍全页面刷新方法:有时候可能会用到 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.loc ...
- Hibernate: 数据持久层框架
Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hi ...
- Markdown常用语法学习
Markdown常用语法学习,这些就够用了. 演示地址: https://github.com/YalongYan/Markdown-- 特别提示: 标题'##'后面必须加一个空格,否则编译不对.# ...
- Linux 安装OpenSSL出错的解决方法
以前编译php没有 –with–openssl 现在要使用到 openssl ,phpinze扩展安装,但是在make时候报错 今天找这个在网上找了大半天,最后总结应该是php版本本身的问题,错误是p ...
- python在windows下安装paramiko模块和安装pycrypto模块(3步搞定)(转)
Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypto模块,因此要在Python中使用SSH,我们需要先安装pycr ...
- sql server 2008 去除html标签
由于商品详情数据库的字段是text,存放的是html,但是要求导出的商品详情中只是商品的描述,不要标签,原来打算先把数据导入excel中,然后利用java的正则去替换,结果由于商品详情太大,一个单元格 ...
- 如何实现模拟器(CHIP-8 interpreter) 绝佳杰作.
转自 http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/ How to write an ...
- 优化tomcat启动速度
1.去掉不需要的jar包,这样tomcat在启动时就可以少加载jar包里面的class文件. 2.跳过一些与TLD files.注解.网络碎片无关的jar包,通过在conf/catalina.prop ...