多线程随笔二(Task)
Task类是.net 4.0新加进来的特性,对原有的Thread,ThreadPool做了进一步的封装,使得.net平台上的多线程编程变得更加方便。废话不多说,进入正题。
一. Task启动
Task启动主要有以下几种用法:
1.构造Task对象,启动Task
Task myTask = new Task(DoSomething);
myTask.Start();
2.通过Task.Factory启动Task
Task second = Task.Factory.StartNew(DoSomething);
两者的区别在于Task创建之后需要通过Start方法启动,而Task.Factory的StartNew方法直接就启动了该Task,无需通过手动方法启动。
参数一般为一个Delegate,Action或者Lambda表达式,告诉该Task需要执行什么方法。
此外Task跟Task.Factory还有两个带返回值的版本,用于带返回值的任务,如下:
Task<MyClass> myTask = new Task<MyClass>(()=> new MyClass());
myTask.Start();
Task<MyClass> second = Task.Factory.StartNew(() => new MyClass());
二. Task返回值(泛型版本才有返回值)
可以通过以下方法获取返回值(注意,此操作会阻塞当前线程):
var result = myTask.Result;
如果想要获取线程当前的状态,可以调用Task的Status属性,该属性是一个枚举值。
三. Task结束
如果需要手动控制Task的结束,微软提供了CancellationTokenSource令牌类,使用方式如下:
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
Task<MyClass> myTask = new Task<MyClass>(() =>{Thread.Sleep();return new MyClass();},cancelTokenSource.Token);
myTask.Start();
cancelTokenSource.Cancel();
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
Task<MyClass> myTask = Task.Factory.StartNew(() => { Thread.Sleep(); return new MyClass(); }, cancelTokenSource.Token);
cancelTokenSource.Cancel();
通过Cancel方法结束目标Task。
关于Task的要点就记录到这,有什么不足的地方之后再补充。
多线程随笔二(Task)的更多相关文章
- JAVA 多线程随笔 (二) sleep, yield, join, wait 和notify
这里先说明一下锁对象,如果一个类比如Person里的方法都有synchronized来修饰,那么每一个方法的锁对象就是Person的一个实例person. 锁对象也可以针对某个特定的实例, 比如syn ...
- C# 多线程六之Task(任务)三之任务工厂
1.知识回顾,简要概述 前面两篇关于Task的随笔,C# 多线程五之Task(任务)一 和 C# 多线程六之Task(任务)二,介绍了关于Task的一些基本的用法,以及一些使用的要点,如果都看懂了,本 ...
- 异步多线程 Thread ThreadPool Task
一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...
- [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)
[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...
- 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)
[源码下载] 重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel) 作者:webabcd 介绍重新想象 W ...
- C#多线程实现方法——Task/Task.Factary
原文:C#多线程实现方法--Task/Task.Factary Task 使用 Task以及Task.Factory都是在.Net 4引用的.Task跟Thread很类似,通过下面例子可以看到. st ...
- .net 多线程 Thread ThreadPool Task
先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name">< ...
- Java多线程(二)关于多线程的CPU密集型和IO密集型这件事
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
随机推荐
- Webx小应用的实现整理与分析
Webx小应用的实现整理与分析 初次在园子里与大家分享自己的所学,欢迎各种指点~ By 仰城 2013-08-07 学习一段时间webx.ibatis.spring以及maven的基本知识之后,应用它 ...
- Supervisor 管理后台守护进程
Supervisor 管理后台守护进程 参考原文如下: http://codinn.com/people/brant/notes/110948/ 做了一些注释 +++++++++++引用开始+++++ ...
- Lucene简介(理论篇)
Lucene 是一个软件程序的库或者说是一个工具套件,而不是一个完全的具有搜索特性的应用程序.它关注于自己的文本检索和搜索功能,提供API来完成商业中所涉及到的搜索功能.在搜索功能中,Lucene的功 ...
- pipe----管道----fork
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h&g ...
- C#:using与.net对象销毁
一 . 1.using 语句获取一个或多个资源,执行一个语句,然后处置该资源. 2.using 语句: using ( 资源获取 ) 嵌入语句 3.资源获取: 局部变量声明 表达式 资源是实现 ...
- Mac 安装 Grunt
第一步:安装brew 打开http://brew.sh/登陆brewhome官网,上面有安装命令. 第二步:安装node 第一步安装成功后,命令行输入 brew install node 第三步:安装 ...
- ORA-01940无法删除当前已连接用户
原文地址:ORA-01940无法删除当前已连接用户作者:1736188794 1)查看用户的连接状况 select username,sid,serial# from v$session ------ ...
- 为什么说2017全球云计算大会中国站 (Cloud Connect China 2017)不得不参加?
2017全球云计算大会中国站将继续关注全球云计算产业现状及最热门的领域,设立主题论坛.2017全球云计算大会中国站将于2017年9月5-7日在上海世博展览馆.正如去年9月活动现场所预告的,2017年除 ...
- bootstrap 混合标签
<html lang="zh_cn"> <head> <meta charset="utf-8"> <meta htt ...
- winServer2008下安装SqlServer2008数据库
1 安装文件包 文件名 cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso SHA1 0EEFF017B21635DF33F33C ...