1. static public void ThreadMain()
  2. {
  3. Thread t1 = new Thread(TaskWorker);
  4. t1.Start(3);
  5. }
  6. static public void TaskMain()
  7. {
  8. Task t1 = new Task(TaskWorker, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
  9. Console.WriteLine(t1.Status);
  10. t1.Start();
  11. t1.Wait(); // need to wait for finishing.
  12. }
  13. static public void TaskWorker(object state)
  14. {
  15. int nTime = (int)state;
  16. for (int i = 0; i < nTime; i++)
  17. {
  18. Thread.Sleep(100);
  19. Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
  20. }
  21. return;
  22. }

我们看到TaskWorker都是用于Task以及Thread,都是只能接受一个参数(Action<object>),不过task可以支持工作函数具有返回值(Func<TRessult>()或者Func<object, TResult>)。但是弱的类型输入跟thread一样。Task提供返回值是为了后面说到的task结构层次有用。

下面是调用一个具有返回值的工作函数

  1. static public int TaskWorkerWithReturn(object state)
  2. {
  3. int nTime = (int)state;
  4. for (int i = 0; i < nTime; i++)
  5. {
  6. Thread.Sleep(100);
  7. Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
  8. }
  9. nTime++;
  10. return nTime;
  11. }

主调函数为:

  1. Task<int> t2 = new Task<int>(TaskWorkerWithReturn, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
  2. t2.Start();
  3. t2.Wait();
  4. Console.WriteLine(t2.Result);

不管从工作函数是否有返回值,task都需要在其运行过程中至少有一个前台线程在跑,否则会直接退出,根本原因是所有task都是后台线程。task的工作函数的输入参数类型职能是object。

同步

对于没有返回值的工作函数需要通过内核对象来同步主调线程(例如task内置的事件,使用wait来阻塞等待);

对于有返回值的工作函数可以通过访问其Result函数来实现阻塞等待。

  1. static public int TaskWorkerWithReturn(object state)
  2. {
  3. int nTime = (int)state;
  4. for (int i = 0; i < nTime; i++)
  5. {
  6. Thread.Sleep(100);
  7. Console.WriteLine(string.Format("current thread {0} sleep for {1} miniseconds .", Task.CurrentId, (i + 1) * 100));
  8. }
  9. nTime++;
  10. return nTime;
  11. }

主调函数:

  1. Task<int> t2 = new Task<int>(TaskWorkerWithReturn, 3, TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
  2. t2.Start();
  3. Console.WriteLine("t2:" + t2.Result);

异步调用

作为新的一个特性在.net 4中引入,task能实现丰富的异步调用,使用成员函数ContinueWith来响应异步工作函数的完成,注意,不一定由之前完成异步函数的线程执行

  1. static public void TaskMain()
  2. {
  3. Task<int> t3 = new Task<int>(FirstTask, 1);
  4. t3.Start();
  5. Task<int> t4 = t3.ContinueWith<int>(RecusiveTask);
  6. Task<int> t5 = t4.ContinueWith<int>(RecusiveTask);
  7. Task<int> t6 = t5.ContinueWith<int>(RecusiveTask).ContinueWith<int>(RecusiveTask);
  8. //Console.WriteLine(string.Format("final result: {0}", t6.Result));
  9. }
  10. static public int FirstTask(object state)
  11. {
  12. int data = (int)state;
  13. for (int i = 0; i < data; i++)
  14. {
  15. Thread.Sleep(100);
  16. Console.WriteLine(string.Format("current thread {0} slept for {1} milisecond.", Task.CurrentId, (i + 1) * 100));
  17. }
  18. data++;
  19. return data;
  20. }
  21. static public int RecusiveTask(Task<int> T)
  22. {
  23. int data = T.Result;
  24. for (int i = 0; i < data; i++)
  25. {
  26. Thread.Sleep(100);
  27. Console.WriteLine(string.Format("current thread {0} slept for {1} milisecond.", Task.CurrentId, (i + 1) * 100));
  28. }
  29. data++;
  30. return data;
  31. }

输出结果为:

  1. current thread 1 slept for 100 milisecond.
  2. current thread 2 slept for 100 milisecond.
  3. current thread 2 slept for 200 milisecond.
  4. current thread 3 slept for 100 milisecond.
  5. current thread 3 slept for 200 milisecond.
  6. current thread 3 slept for 300 milisecond.
  7. current thread 4 slept for 100 milisecond.
  8. current thread 4 slept for 200 milisecond.
  9. current thread 4 slept for 300 milisecond.
  10. current thread 4 slept for 400 milisecond.
  11. current thread 5 slept for 100 milisecond.
  12. current thread 5 slept for 200 milisecond.
  13. current thread 5 slept for 300 milisecond.
  14. current thread 5 slept for 400 milisecond.
  15. current thread 5 slept for 500 milisecond.
  16. final result: 6
  17. 请按任意键继续. . .

Task 使用 Task以及Task.Factory都是在.Net 4引用的。Task跟Thread很类似,通过下面例子可以看到。的更多相关文章

  1. angular的$resource factory都有啥

    angular的$resource factory都有啥 A factory which creates a resource object that lets you interact with R ...

  2. 这篇建议java开发都看看,对Java方法及加深理解的很深,值得一看!

    方法和加深 方法的定义 修饰符 返回类型 break:跳出switch,结束循环 和 return 的区别 方法名:注意规范 见名知意 参数列表(参数类型,参数名)- 异常抛出 // Demo01 类 ...

  3. html5音频audio对象处理以及ios微信端自动播放和息屏后唤醒的判断---可供参考(功能都完整实现了,只是细节还没处理的很好)

    // html模版中的 此处结合了weui样式整合的微信手机端片段代码(不可直接粘贴复制进行使用)里面含有一些php的写法,可直接略过..###重点参考js代码### <div> < ...

  4. C#多线程实现方法——Task/Task.Factary

    原文:C#多线程实现方法--Task/Task.Factary Task 使用 Task以及Task.Factory都是在.Net 4引用的.Task跟Thread很类似,通过下面例子可以看到. st ...

  5. Task 和 ThreadPool

    在C#中 TASK 和 ThreadPool 都可以完成多任务并行的工作.但是 TASK实际上是微软定义好的,基于 ThreadPool 的一个类.这里面微软做了很多优化工作. Task Parall ...

  6. Activity Process Task Application 专题讲解

    Activity Process Task Application 专题讲解 Activity.和进程 为了阅读方便,将文档转成pdf http://files.cnblogs.com/franksu ...

  7. 使用SBT构建Scala应用(转自git)

    # 使用SBT构建Scala应用 ## SBT简介 SBT是Simple Build Tool的简称,如果读者使用过Maven,那么可以简单将SBT看做是Scala世界的Maven,虽然二者各有优劣, ...

  8. 【原】SBT构建Scala应用

    [转帖] 原文地址:https://github.com/CSUG/real_world_scala/blob/master/02_sbt.markdown 尊重版权,尊重他人劳动成果,转帖请注明原文 ...

  9. Android群英传笔记——第八章:Activity与Activity调用栈分析

    Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命 ...

随机推荐

  1. GoAhead 嵌入式web

    https://embedthis.com/goahead/ 入手了一个360  4g  wifi :使用jquery  .goahead Goahead webserver编辑 GoAhead We ...

  2. Swift Tips - Array 类型

    在开发中,数组这个概念我们应该很熟悉了,Objective-C 中为我们提供了 NSArray 作为数组的实现.大家应该对很熟悉了.而在 Swift 中,为我们提供了它自己对于数组的实现,也是这里我们 ...

  3. 通过firefox+ProxySelector+dtunnel_lite实现代理上网

    通过firefox+ProxySelector+dtunnel_lite实现代理上网 dtunnel_lite:http://dog-tunnel.tk/下载lite版本就可以 远端:./dtunne ...

  4. 22.I/O特性

    IO资源 IO是与外界沟通和控制的通道,fpga提供了丰富的IO和一些实用的特性. 本文简要的将主要的特性摘录下来做设计参考用.具体参数参考handbook. 第一部分:IO特性概述 -----通过软 ...

  5. c++学习笔记之变量

    变量的命名规则:标示符要能体现含义,变量的名字一般用小写,用户自己定义的类一般第一个字母大写,如果标示符有多个单词组成,则需要加下划线.' 变量声明和定义的关系:程序有多个文件组成,有时候需要再多个文 ...

  6. [shell练习]——awk练习题

    1. sed和awk有什么区别? (1)awk:按列(域)操作:sed:按行操作(2)awk:文本处理语言,适合对文本进行抽取处理:sed:非交互式的编辑器,适合对文本进行编辑 2. awk要处理域的 ...

  7. Travis-CI的进一步使用

    今天主要对.travis.yml文件和makefile进行进一步的了解: 1.在.travis.yml文件中添加了给linux系统中安装了cppunit库的语句,使能够持续集成写过的单元测试的代码.主 ...

  8. php编写验证码

    今天学习到了php登录时的验证码,验证码在我们平时的网站建设中是非常重要的,对于放置一些灌水机.脚本攻击是一个很好地策略. 下面是我写的代码: <?php session_start(); // ...

  9. Netsharp快速入门(之3) 基础档案(之B 实体建模 新建项目)

    作者:秋时 杨昶   时间:2014-02-15  转载须说明出处 3.3     创建业务模型 3.3.1  新建项目 1.打开业务模型 2.打开业务模型后,在工具栏上选择操作-新增项目分类,标识这 ...

  10. C#预编译指令

    近日工作涉及到于外部系统交互,对方提供接口:但是在双方系统未联调时,引用外部DLL,相关类实例化,提示异常错误(错误消息正常):后面操作无法进行,那如何写调试代码,即在调试时不运行某段代码,而在正式发 ...