Task 使用 Task以及Task.Factory都是在.Net 4引用的。Task跟Thread很类似,通过下面例子可以看到。
- static public void ThreadMain()
- {
- Thread t1 = new Thread(TaskWorker);
- t1.Start(3);
- }
- static public void TaskMain()
- {
- Task t1 = new Task(TaskWorker, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
- Console.WriteLine(t1.Status);
- t1.Start();
- t1.Wait(); // need to wait for finishing.
- }
- static public void TaskWorker(object state)
- {
- int nTime = (int)state;
- for (int i = 0; i < nTime; i++)
- {
- Thread.Sleep(100);
- Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
- }
- return;
- }
我们看到TaskWorker都是用于Task以及Thread,都是只能接受一个参数(Action<object>),不过task可以支持工作函数具有返回值(Func<TRessult>()或者Func<object, TResult>)。但是弱的类型输入跟thread一样。Task提供返回值是为了后面说到的task结构层次有用。
下面是调用一个具有返回值的工作函数
- static public int TaskWorkerWithReturn(object state)
- {
- int nTime = (int)state;
- for (int i = 0; i < nTime; i++)
- {
- Thread.Sleep(100);
- Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
- }
- nTime++;
- return nTime;
- }
主调函数为:
- Task<int> t2 = new Task<int>(TaskWorkerWithReturn, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
- t2.Start();
- t2.Wait();
- Console.WriteLine(t2.Result);
不管从工作函数是否有返回值,task都需要在其运行过程中至少有一个前台线程在跑,否则会直接退出,根本原因是所有task都是后台线程。task的工作函数的输入参数类型职能是object。
同步
对于没有返回值的工作函数需要通过内核对象来同步主调线程(例如task内置的事件,使用wait来阻塞等待);
对于有返回值的工作函数可以通过访问其Result函数来实现阻塞等待。
- static public int TaskWorkerWithReturn(object state)
- {
- int nTime = (int)state;
- for (int i = 0; i < nTime; i++)
- {
- Thread.Sleep(100);
- Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
- }
- nTime++;
- return nTime;
- }
主调函数:
- Task<int> t2 = new Task<int>(TaskWorkerWithReturn, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
- t2.Start();
- Console.WriteLine("t2:" + t2.Result);
异步调用
作为新的一个特性在.net 4中引入,task能实现丰富的异步调用,使用成员函数ContinueWith来响应异步工作函数的完成,注意,不一定由之前完成异步函数的线程执行。
- static public void TaskMain()
- {
- Task<int> t3 = new Task<int>(FirstTask, 1);
- t3.Start();
- Task<int> t4 = t3.ContinueWith<int>(RecusiveTask);
- Task<int> t5 = t4.ContinueWith<int>(RecusiveTask);
- Task<int> t6 = t5.ContinueWith<int>(RecusiveTask).ContinueWith<int>(RecusiveTask);
- //Console.WriteLine(string.Format("final result: {0}", t6.Result));
- }
- static public int FirstTask(object state)
- {
- int data = (int)state;
- for (int i = 0; i < data; i++)
- {
- Thread.Sleep(100);
- Console.WriteLine(string.Format("current thread {0} slept for {1} milisecond.", Task.CurrentId, (i + 1) * 100));
- }
- data++;
- return data;
- }
- static public int RecusiveTask(Task<int> T)
- {
- int data = T.Result;
- for (int i = 0; i < data; i++)
- {
- Thread.Sleep(100);
- Console.WriteLine(string.Format("current thread {0} slept for {1} milisecond.", Task.CurrentId, (i + 1) * 100));
- }
- data++;
- return data;
- }
输出结果为:
- current thread 1 slept for 100 milisecond.
- current thread 2 slept for 100 milisecond.
- current thread 2 slept for 200 milisecond.
- current thread 3 slept for 100 milisecond.
- current thread 3 slept for 200 milisecond.
- current thread 3 slept for 300 milisecond.
- current thread 4 slept for 100 milisecond.
- current thread 4 slept for 200 milisecond.
- current thread 4 slept for 300 milisecond.
- current thread 4 slept for 400 milisecond.
- current thread 5 slept for 100 milisecond.
- current thread 5 slept for 200 milisecond.
- current thread 5 slept for 300 milisecond.
- current thread 5 slept for 400 milisecond.
- current thread 5 slept for 500 milisecond.
- final result: 6
- 请按任意键继续. . .
Task 使用 Task以及Task.Factory都是在.Net 4引用的。Task跟Thread很类似,通过下面例子可以看到。的更多相关文章
- angular的$resource factory都有啥
angular的$resource factory都有啥 A factory which creates a resource object that lets you interact with R ...
- 这篇建议java开发都看看,对Java方法及加深理解的很深,值得一看!
方法和加深 方法的定义 修饰符 返回类型 break:跳出switch,结束循环 和 return 的区别 方法名:注意规范 见名知意 参数列表(参数类型,参数名)- 异常抛出 // Demo01 类 ...
- html5音频audio对象处理以及ios微信端自动播放和息屏后唤醒的判断---可供参考(功能都完整实现了,只是细节还没处理的很好)
// html模版中的 此处结合了weui样式整合的微信手机端片段代码(不可直接粘贴复制进行使用)里面含有一些php的写法,可直接略过..###重点参考js代码### <div> < ...
- C#多线程实现方法——Task/Task.Factary
原文:C#多线程实现方法--Task/Task.Factary Task 使用 Task以及Task.Factory都是在.Net 4引用的.Task跟Thread很类似,通过下面例子可以看到. st ...
- Task 和 ThreadPool
在C#中 TASK 和 ThreadPool 都可以完成多任务并行的工作.但是 TASK实际上是微软定义好的,基于 ThreadPool 的一个类.这里面微软做了很多优化工作. Task Parall ...
- Activity Process Task Application 专题讲解
Activity Process Task Application 专题讲解 Activity.和进程 为了阅读方便,将文档转成pdf http://files.cnblogs.com/franksu ...
- 使用SBT构建Scala应用(转自git)
# 使用SBT构建Scala应用 ## SBT简介 SBT是Simple Build Tool的简称,如果读者使用过Maven,那么可以简单将SBT看做是Scala世界的Maven,虽然二者各有优劣, ...
- 【原】SBT构建Scala应用
[转帖] 原文地址:https://github.com/CSUG/real_world_scala/blob/master/02_sbt.markdown 尊重版权,尊重他人劳动成果,转帖请注明原文 ...
- Android群英传笔记——第八章:Activity与Activity调用栈分析
Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...
随机推荐
- PB中multieditline空间的“~r~n"转"~n"
private: constant String MULEDIT_NEWLINE = "~r~n" //multilineEdit控件的换行符号 constant String M ...
- CoolShell Puzzle攻略[更新隐藏剧情]
CoolShell博主陈皓做了一个在线的puzzle很有意思,链接在这里,这里记录一下解题的一些步骤. Puzzle 0 ++++++++[>+>++>+++>++++> ...
- DebugViewHierarchy
DebugViewHierarchy(视图调试)是XCode6新出的一项功能,它可以让开发者在程序运行时,动态的查看当前界面的显示情况,包括视图的层次,控件的大小和位置,而且会以3D效果显示当前视图的 ...
- C/C++常用头文件及函数汇总
转自: C/C++常用头文件及函数汇总 C/C++头文件一览 C #include <assert.h> //设定插入点#include <ctype.h> //字符处理#in ...
- Netsharp快速入门(之15) 销售管理(报表B 销售季度表)
作者:秋时 杨昶 转载须说明出处 4.6.2 销售季度表(交叉表) 1.1.1.1 交叉表带数据源和不带数据源区别 带数据源的可以自定义数据源,可以从实体,也可以从Sql脚本得到数据源,并能自定 ...
- 深入探讨Java类加载机制
一.前言 毕业至今,已经三年光景,平时基本接触不到关于类加载器的技术(工作上),相信很多同行在开始工作后很长一段时间,对于类的加载机制都没有深入的了解过,之前偶然的机会接触了相关的知识,感觉挺有意思, ...
- netty 入门
先啰嗦两句,使用 netty 来搭建服务器程序,可以发现相比于传统的 nio 程序, netty 的代码更加简洁,开发难度更低,扩展性也很好,非常适合作为基础通信框架. 下面上代码: Server p ...
- HDU 5446 Unknown Treasure Lucas+中国剩余定理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...
- 二分---LIGHTOJ 1062
1062 - Crossed Ladders PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB A ...
- 【BZOJ】【3790】神奇项链
Manacher算法/DP 找出所有的回文串,看做是一个个线段,那么问题就转化成了用最少的线段将整个区间覆盖起来,可以重叠,那么这就是一个DP了= = Orz ZKY大爷,让蒟蒻开眼界了……头一次知道 ...