首先来说说 Task.Factory.StartNew这种方式来创建Task,这里的WaitAll()指的是等待所有Task执行完成,并且里面的Task参数(t1,t2)是异步的,先以匿名委托方式

        static void Main(string[] args)
{
Task t1 = Task.Factory.StartNew(delegate { MyMethodA(); });
Task t2 = Task.Factory.StartNew(delegate { MyMethodB(); });
Task.WaitAll(t1, t2); Console.ReadKey(); Console.ReadKey();
} private static void MyMethodA()
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
Console.WriteLine("A");
} private static void MyMethodB()
{
Console.WriteLine("B");
}

其运行结果是
     B

A

再看看以传参函数形式来看,并以拉姆达表达式来进行

        static void Main(string[] args)
{ Task<string> t1 = Task<string>.Factory.StartNew(()=> MyMethodA("AAAAA") );
Task t2 = Task.Factory.StartNew(()=> MyMethodB());
Task.WaitAll(t1, t2);
Console.WriteLine("第二次输入" + t1.Result);
Console.ReadKey(); Console.ReadKey();
} private static string MyMethodA(string value)
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
Console.WriteLine(value);
return value;
} private static void MyMethodB()
{
Console.WriteLine("B");
}

因MyMethodA()里面将task线程挂起了,所以先输出了B,也证明了Task的异步!

使用New Task创建TASK

、最简单的构造Task的方式为使用lambda表达式:

  1. Task<int> task = new Task<int>(() => TaskMethod("Task 1"));
  2. task.Start();
  3. int result = task.Result;
  4. Console.WriteLine("Result is: {0}", result);
Task<int> task = new Task<int>(() => TaskMethod("Task 1"));
task.Start();
int result = task.Result;
Console.WriteLine("Result is: {0}", result);

需要注意的是,我们构造了Task<int>任务,然后Start(),之后返回值即task.Result属性!由于Result的关系,因此线程将等待result得到后再往下进行。

二、Task同步运行RunSynchronously

  1. Task<int>  task = CreateTask("Task 2");
  2. task.RunSynchronously(); //运行在主线程中,等同于直接运行: TaskMethod("Task 2");
  3. int result = task.Result;
  4. Console.WriteLine("Result is: {0}", result);
Task<int>  task = CreateTask("Task 2");
task.RunSynchronously(); //运行在主线程中,等同于直接运行: TaskMethod("Task 2");
int result = task.Result;
Console.WriteLine("Result is: {0}", result);

这里没有使用Start()而是使用RunSynchronously(),直接同步运行!等同于直接运行 Result = TaskMethod("Task 2");

因此,该Task不是运行在线程池中,而是运行在主线程中。

三、Task的运行状态

  1. Task<int> task = CreateTask("Task 3");
  2. Console.WriteLine(task.Status);
  3. task.Start();
  4. while (!task.IsCompleted)
  5. {
  6. Console.WriteLine(task.Status);
  7. Thread.Sleep(TimeSpan.FromSeconds(0.5));
  8. }
  9. Console.WriteLine(task.Status);
  10. int result = task.Result;
  11. Console.WriteLine("Result is: {0}", result);
Task<int> task = CreateTask("Task 3");
Console.WriteLine(task.Status);
task.Start();
while (!task.IsCompleted)
{
Console.WriteLine(task.Status);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
}
Console.WriteLine(task.Status);
int result = task.Result;
Console.WriteLine("Result is: {0}", result);

上面的代码使用了状态判断(IsCompleted)轮查方式,输出了不同的Task状态。等到task执行完毕后,也就自然得到int结果。

关于Task的认识的更多相关文章

  1. Concepts:Request 和 Task

    当SQL Server Engine 接收到Session发出的Request时,SQL Server OS将Request和Task绑定,并为Task分配一个Workder.在TSQL Query执 ...

  2. .Net多线程编程—任务Task

    1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...

  3. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  4. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

  5. Openstack Periodic Task

    Openstack Periodic Task 周期性任务在各个模块的manager.py(computer,scheduler,cell,network)中添加. 添加方法:在模块manager类实 ...

  6. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

  7. [Java定时器]用Spring Task实现一个简单的定时器.

    今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...

  8. 定时管理器框架-Task.MainForm

    入住博客园4年多了,一直都是看别人的博客,学习别人的知识,为各个默默无私贡献自己技术总结的朋友们顶一个:这几天突然觉得是时候加入该队列中,贡献出自己微弱的力量,努力做到每个月有不同学习总结,知识学习的 ...

  9. Task三个列子的分享

    这次要分享的是C#Task任务的几个列子,感觉最实用的是封装的分页任务执行方法,这个方法步奏也是目前在我工作中执行多任务常用的,不知道各位也有这用的情况,那么开始吧. 1.顺序任务执行 //顺序任务执 ...

  10. webapi+Task并行请求不同接口实例

    标题的名称定义不知道是否准确,不过我想表达的意思就是使用Task特性来同时请求多个不同的接口,然后合并数据:我想这种场景的开发对于对接过其他公司接口的人不会陌生,本人也是列属于之内,更多的是使用最原始 ...

随机推荐

  1. Python全栈day17(文件处理)

    一,文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 二,文件打开模式 r只读 (默认打开模式是只读) w只写 a追加 三,文件操作实例 1.r读 read读取文 ...

  2. c# 日常记录,(获取系统时间、return),一些文件隐藏无法引用,c#多个窗体之间传值

    1.获取系统时间 DateTime.Now.ToString(); DateTime dt =DateTime.Now; dt.AddDays(1); //增加一天 dt.AddDays(-1);// ...

  3. BroPHP使用心得

    使用BroPHP 学习框架的时候,遇到了不少的问题. 一.修改了mysql 的表结构后,在程序中始终不体现表的修改. 给一个表添加了几个字段,在程序中对表添加数据,无论是用 select(),还是用 ...

  4. 剑指Offer——二叉搜索树的第k个结点

    题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点. 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4 分析: 二叉搜索树中序遍历就是从小到大.只 ...

  5. 剑指Offer——合并两个排序的链表

    题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 苦力活,使用两个指针分别指向未被合并的两个链表的首部,比较两个首部数值的大小,合并数值 ...

  6. Allocation-Free Collections(在堆栈上使用内存)

    假设你有一个方法,通过创建临时的List来收集某些数据,并根据这些数据来统计信息,然后销毁这个临时列表.这个方法被经常调用,导致大量内存分配和释放以及增加的内存碎片.此外,所有这些内存管理都需要时间, ...

  7. 申请startssl免费一年ssl证书(转)

    原文:http://www.live-in.org/archives/1296.html 申请过程步骤蛮多的,对于像我这样的小白来说还是截图+文字记录下比较好.浏览器是firefox. 1.打开htt ...

  8. sap 动态字段的使用

    1.sap中的动态字段其实类似c#里面的指针,都是指向的地址. 只是写法不同,sap 中的field-symbols就是类似指针. , b TYPE i. FIELD-SYMBOLS <fs&g ...

  9. python与c语言交互应用实例

    1.python向c语言写数据 1) 先将接收端编译成一个共享链接库gcc/arm-linux-gnueabihf-gcc -o bluetooth_proxy.so -shared -fPIC bl ...

  10. maven+springmvc+spring+mybatis

    一.项目搭建 1)创建maven项目 选择apache的maven-archetype-webapp 填入groupID : 例如 com.mracale artifactId :例如 shoppin ...