TPL异步并行编程之简单使用
并行编程一直是一个老生常谈的话题
在这里记录一下TPL编程,这在net4.0 微软就已经提供了多核时代下的并行库,其中最核心的最常用的也就是Task
一 Task是什么
Task可以简单的理解为一个线程的封装,向外部暴露几种接口,如常见的Task.Run,Task.Factory.StartNew;当一个Task启动后应用程序将会等待这个Task的执行,但是不会去阻塞UI线程,换句话说,我丢了一个任务跟一个线程并让他去执行,然后我马上回到UI线程,这个线程运行完了就告诉UI线程我完事了,然后继续执行Task之后的代码,这也是微软新的一种异步机制
二 Task可以干什么,从简单的开始
2.1 将一个耗时的操作,比如io,需要网络连接的操作,或者计算,我们直接丢一个方法交给Task去执行
如: Task.Factory.StartNew(() =>
{
//耗时操作
Console.WriteLine("Hello World");
});
2.2 将一个操作丢给Task,获取Task执行完成的结果
static void Main(string[] args)
{
// create the task
Task<int> task1 = new Task<int>(() =>
{
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum += i;
}
return sum;
});
task1.Start();
// write out the result
Console.WriteLine("Result 1: {0}", task1.Result);
Console.ReadLine();
}
2.3 向Task执行的方法传入参数,其实这个基本没什么用,因为要执行的函数本身可以直接使用参数
如;static void Main(string[] args)
{
string[] messages = { "First task", "Second task",
"Third task", "Fourth task" };
foreach (string msg in messages)
{
//这里printMessage需要的参数可以直接使用msg,所以Task传递的msg其实没多大用,
// Task myTask = new Task(() => printMessage( msg), msg);
Task myTask = new Task(obj => printMessage((string)obj), msg);
myTask.Start();
}
// wait for input before exiting
Console.WriteLine("Main method complete. Press enter to finish.");
Console.ReadLine();
}
static void printMessage(string message)
{
Console.WriteLine("Message: {0}", message);
}
2.4 如果需要Task长时间运行
直接在函数体进行如线程的循环即可:
如:Task.Run(()=>{
while(true)
{
//循环体
}
});
2.5 Task相关参数
2.5.1 优先级
线程都是有优先级的,那么怎样用,怎么设置的:通过构造函数

TaskCreateOptions.None:用默认的方式创建一个Task
TaskCreateOptions.PreferFairness:请求scheduler尽量公平的执行Task(后续文章会将是,Task和线程一样,有优先级的)
TaskCreateOptions.LongRunning:声明Task将会长时间的运行。
TaskCreateOptions.AttachToParent:因为Task是可以嵌套的,所以这个枚举就是把一个子task附加到一个父task中。
TPL异步并行编程之简单使用的更多相关文章
- TPL异步并行编程之取消任务
TPL异步并行编程之简单使用 在上篇随笔里面说明了Task的使用,仅仅是简单使用,有时候把一个任务交给Task去执行,但是呢还是要管理下,比如说:我要叫这个任务停止了,不做了,任务取消了,或者超时了 ...
- TPL异步并行编程之回调
Task是基于ThreadPool线程池基础上的高度异步多线程编程,如果有一天我希望一个需要长时间运行的Task,在被某些异常终止后还能回调一些代码就可以知道Task终止的原因了吧 是的,且看代码 p ...
- TPL异步并行编程之任务超时
此处参考自阿涛的博文:http://www.cnblogs.com/HelloMyWorld/p/5526914.html 一 自己定义 基本的思路: net中异步操作由于是交给线程来实现,因此不可能 ...
- Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别
Task C# 多线程和异步模型 TPL模型 Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...
- 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单
一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两 ...
- java socket编程开发简单例子 与 nio非阻塞通道
基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...
- socket编程,简单多线程服务端测试程序
socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.acce ...
- winsock 编程(简单客户&服务端通信实现)
winsock 编程(简单客户&服务端通信实现) 双向通信:Client send message to Server, and if Server receive the message, ...
- 转:[你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单
本专题概要: 引言 同步代码存在的问题 传统的异步编程改善程序的响应 C# 5.0 提供的async和await使异步编程更简单 async和await关键字剖析 小结 一.引言 在之前的C#基础知 ...
随机推荐
- 2013年最好的Python开源项目汇总
2013年Python社区诞生了很多实用的开发工具,这些工具 在一定程度上 可以帮助你节省更多的时间.本文为你汇总了这些工具,它们大部分都是开源的,你还可以通过源码来学习更多的Python开发知识. ...
- TROUBLE SHOOTING: FRM-30425
关键字:Oracle Form buider FRM-30425 汇总 错误信息如下: FRM-30425: Summarized database item must reside in a blo ...
- MySQL - 主从复制及读写分离原理
1.MySQL主从复制与读写分离原理 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL ...
- 从头学Qt Quick系列
http://www.cnblogs.com/csulennon/category/686605.html
- Jquery学习笔记:利用parent和parents方法获取父节点
通过选择器一般只能获取指定标识的节点,或者获取子节点. 有些场景下,往往需要根据当前节点找到满足条件的父节点.这个可以通过相应的方法来实现. 1.parent方法 该方法可以获取元素的直接父节点. 我 ...
- UVALive 6931 Can't stop playing (Regionals 2014 >> Europe - Central)
题目 一开始有一个双头队列,每次添加一个数(这是数是二的幂,所有数的和不大于\(2^13\)),由你来决定添加到队头还是队尾.如果队列里面相邻的两个数相同,设它们都是\(x\),那么这两个数会合并为\ ...
- [置顶] Oracle 11g ASM:如何在 ASMCMD 命令行工具中创建 Oracle ACFS 文件系统
实验环境:Oracle 11g R2 RAC (11.2.0.3.5) Oracle Enterprise Linux 5.6 x86 1.创建 ASM 磁盘组 在两节点 ...
- switch的方便用法
int ch = getch(); switch(ch) { case '0' ... '9': if (in_count) { count = count * 10 + (ch - '0'); } ...
- IOS系统对fixed定位支持不好的解决方法
问题: IOS 中所有浏览器,当页面上的输入框获得焦点时,呼出键盘. 页面底部的导航栏(position:fixed)会被键盘顶到页面的中间. 而当输入框失去焦点时,导航栏停留在页面中间,造成页面错乱 ...
- boost操作xml 5分钟官方教程
Five Minute Tutorial This tutorial uses XML. Note that the library is not specifically bound to XML, ...