c# .Net并行和多线程编程之Task学习记录!
任务Task和线程Thread的区别:
1、任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。
2、任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。
Task和Thread一样,位于System.Threading命名空间下!
一、创建Task
//第一种创建方式,直接实例化
var task1 = new Task(() =>
{
//TODO you code
});
//第二种创建方式,工厂创建
var task2 = Task.Factory.StartNew(() =>
{
//TODO you code
});
二、Task的简略生命周期:
Created:表示默认初始化任务,但是“工厂创建的”实例直接跳过。
WaitingToRun: 这种状态表示等待任务调度器分配线程给任务执行。
RanToCompletion:任务执行完毕。
三、Task的任务控制
Task最吸引人的地方就是他的任务控制了,你可以很好的控制task的执行顺序,让多个task有序的工作。下面来详细说一下:
1、Task.Wait
task1.Wait();就是等待任务执行(task1)完成,task1的状态变为Completed。
2、Task.WaitAll
看字面意思就知道,就是等待所有的任务都执行完成:
{...
Task.WaitAll(task,task2,task3...N)
Console.WriteLine("All task finished!");
}
即当task,task2,task3...N全部任务都执行完成之后才会往下执行代码(打印出:“All task finished!”)
3、Task.WaitAny
这个用发同Task.WaitAll,就是等待任何一个任务完成就继续向下执行,将上面的代码WaitAll替换为WaitAny
{...
Task.WaitAny(task,task2,task3...N)
Console.WriteLine("Any task finished!");
}
即当task,task2,task3...N任意一个任务都执行完成之后就会往下执行代码(打印出:" Any task finished!”)
4、Task.ContinueWith
就是在第一个Task完成后自动启动下一个Task,实现Task的延续,下面我们来看下他的用法,编写如下代码:
static void Main(string[] args)
{
var task1 = new Task(() =>
{
Console.WriteLine("Task 1 Begin");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Task 1 Finish");
});
var task2 = new Task(() =>
{
Console.WriteLine("Task 2 Begin");
System.Threading.Thread.Sleep(3000);
Console.WriteLine("Task 2 Finish");
});
task1.Start();
task2.Start();
var result = task1.ContinueWith<string>(task =>
{
Console.WriteLine("task1 finished!");
return "This is task result!";
});
Console.WriteLine(result.Result.ToString());
Console.Read();
}
aaarticlea/png;base64,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" alt="" /> 可以看到,task1完成之后,开始执行后面的内容,并且这里我们取得task的返回值。
5、Task的取消
前面说了那么多Task的用法,下面来说下Task的取消,比如我们启动了一个task,出现异常或者用户点击取消等等,我们可以取消这个任务。如何取消一个Task呢,我们通过cancellation的tokens来取消一个Task。在很多Task的Body里面包含循环,我们可以在轮询的时候判断IsCancellationRequested属性是否为True,如果是True的话就return或者抛出异常,抛出异常后面再说,因为还没有说异常处理的东西。
下面在代码中看下如何实现任务的取消,代码如下:
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = Task.Factory.StartNew(() =>
{
for (var i = 0; i < 1000; i++)
{
System.Threading.Thread.Sleep(1000);
if (token.IsCancellationRequested)
{
Console.WriteLine("Abort mission success!");
return;
}
}
}, token);
token.Register(() =>
{
Console.WriteLine("Canceled");
});
Console.WriteLine("Press enter to cancel task...");
Console.ReadKey();
tokenSource.Cancel(); 这里开启了一个Task,并给token注册了一个方法,输出一条信息,然后执行ReadKey开始等待用户输入,用户点击回车后,执行tokenSource.Cancel方法,取消任务。
更多信息:关于Task类
素材收集于网络,理解如有偏颇请回复指正!
c# .Net并行和多线程编程之Task学习记录!的更多相关文章
- iOS多线程编程之NSThread的使用
目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...
- iOS多线程编程之NSThread的使用(转)
本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation ...
- [转] iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首 ...
- [转] iOS多线程编程之NSOperation和NSOperationQueue的使用
<iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是用定义好 ...
- [转]iOS多线程编程之NSThread的使用
1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...
- iOS 多线程编程之Grand Central Dispatch(GCD)
介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其它的对称多处理系统的系统.这建立在任务并行运行的线程池模式的基础上的. 它 ...
- 深入浅出Cocoa多线程编程之 block 与 dispatch quene
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...
- iOS多线程编程之NSThread的使用(转载)
1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的 ...
- iOS多线程编程之NSOperation和NSOperationQueue的使用
前一篇 <iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是 ...
随机推荐
- Appfuse:第一张表维护
1. 建立表userinfo 列名 描述 UserID 主键.自增 UserName 用户名 Pwd 密码 CreateDate 创建日期 2. 在src/main/resources目录下增加文件h ...
- iOS系列 基础篇 09 开关、滑块和分段控件
iOS系列 基础篇 09 开关.滑块和分段控件 目录: 案例说明 开关控件Switch 滑块控件Slider 分段控件Segmented Control 1. 案例说明 开关控件(Switch).滑块 ...
- having过滤语句
having 对部分分组来进行过滤 跟在group by 后面 在having语句中不能包含未分组的列名, select FAge,COUNT(*) from T_Employee where FS ...
- [AlwaysOn Availability Groups]AG排查和监控指南
AG排查和监控指南 1. 排查场景 如下表包含了常用排查的场景.根据被分为几个场景类型,比如Configuration,client connectivity,failover和performance ...
- PHP语法(二):数据类型、运算符和函数
相关链接: PHP语法(一):基础和变量 PHP语法(二):数据类型.运算符和函数 PHP语法(三):控制结构(For循环/If/Switch/While) 这次整理了PHP的数据类型.运算符和函数. ...
- OSI七层模型详解 TCP/IP协议
总结 OSI中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 表示层 数据格式化,代码转 ...
- MyBatis源码分析-MyBatis初始化流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- Struts2 讲解笔记
1.第一个Struts2入门案例 1.找jar包 Struts2-core xwork-core ognl javasist freemarker commons-lang commons-io co ...
- 安全测试 - SQL注入
1. 工具测试: 使用SQLMAP进行扫描 2. 手工测试: 观察参数的值value是否为数字型.如果是数字型进行数字型测试,否则跳到第4步进行字符型测试(例如如果出现a那说明是字符型,如果出现2则将 ...
- ubuntu 14.04 desktop装vnc4server
ubuntu 14.04 desktop上安装vnc4server要装上gnome的一些软件包并修改启动文件~/.vnc/xstartup 问题来源How to make VNC Server wor ...