C# Task 的用法
C# Task 的用法(转自:http://www.wxzzz.com/683.html#)
其实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的用法
C# Task 的用法 其实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不支持线程的取消.完成.失败通知等交互性 ...
随机推荐
- Android中自定义View和自定义动画
Android FrameWork 层给我们提供了很多界面组件,但是在实际的商业开发中这些组件往往并不能完全满足我们的需求,这时候我们就需要自定义我们自己的视图和动画. 我们要重写系统的View就必须 ...
- Android开发入门——Andoird Studio的安装与配置
Android的开发离不开Java,仍然需要对Java进行安装与配置,所以我写了上一篇文章,Java的安装与配置. 开始进行Android Studio的安装与配置. 一.进行配置Java,如果电脑里 ...
- CCLink
1什么是CC-Link? CC-Link全称Control & Communication Link,即控制与通信链路通信,是一种可以同时高速处理控制和信息数据的现场网络系统,可以提供高效.一 ...
- node lesson5--async
https://github.com/alsotang/node-lessons/tree/master/lesson5 https://github.com/nswbmw/N-blog/wiki/% ...
- Python 动图、动画制作 —— moviepy、matplotlib.animation
进入命令行界面(windows ⇒ cmd),下载安装,pip install moviepy 0. figure 的成员函数 # 创建 figure fig, ax = plt.subplots() ...
- 分享 WebBrowser显示Html内容3点细节技巧,解决刷新后空白
直接显示Html内容,不像直接导航网址容易处理: 问题:按微软的控件属性提示,可以用WebBrowser.DocumentText 属性赋值 ,但是这种赋值,只是首次有效,后续切换都没啥作用. 下面给 ...
- Python算法(含源代码下载)
关键字:Python Algorithms Python算法 Mastering Basic Algorithms in the Python Language 使用Python语言掌握基本算法 P ...
- Domain adaptation:连接机器学习(Machine Learning)与迁移学习(Transfer Learning)
domain adaptation(域适配)是一个连接机器学习(machine learning)与迁移学习(transfer learning)的新领域.这一问题的提出在于从原始问题(对应一个 so ...
- React路由配置
React路由简单配置 //入口文件index.js import React from 'react'; import ReactDom from 'react-dom'; import { Rou ...
- WPF 4 单词拼写检查(SpellCheck)
原文:WPF 4 单词拼写检查(SpellCheck) 在WPF中 Textbox 和RichTextBox 控件都内置了拼写检查属性,但该属性目前默认仅支持English.Spanish. ...