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

1.顺序任务执行

 //顺序任务执行
             Task.Factory.StartNew<); ; }).
                 //等待5s以后才会依次输出2,3
                  ContinueWith((task) =>
                  {

                      Stopwatch wt = new Stopwatch();
                      wt.Start();
                      Thread.Sleep( * );
                      wt.Stop();
                      Console.WriteLine();
                  }).
                  ContinueWith((task) => { Console.WriteLine(); }).
                  Wait();

  上面的代码中也备注了一些文字说明,其中有关键词语及意思如下:

  .Task.Factory.StartNew:创建一个Task实例,创建后自动开启,无需在调用Start;

  .ContinueWith:看单词的意思就明了,是继续的意思,在这里的效果也是等待上一个Task执行完毕了在继续执行本次任务,这里方法里面每个任务是一层一层传递的

  效果图:

  

  这里有个地方注意,sleep这是了5s但是这里使用Stopwatch统计出来只有4999ms,这个地方存在差异性,本章不解释,有兴趣朋友可以分享下或研究下。

  2.并行任务效果

 //并行任务
             var watch = new Stopwatch();
             //func方法(认知特点:任意长度参数,最后一个的类型是方法返回的返回值类型)
             Func<object, int> fun = (num) =>
             {
                 Thread.Sleep( * );
                 Console.WriteLine("第{0}个", num);
                 return Convert.ToInt32(num);
             };
             ;
             var tasks = new Task<int>[len];
             //开始计算处理时间
             watch.Start();
             ; _i < len; _i++)
             {
                 //Task.Factory.StartNew直接开启Task任务无需在使用start
                 tasks[_i] = Task.Factory.StartNew<int>(fun, _i);
             }
             //10s等待
             Task.WaitAll(tasks,  * );
             watch.Stop();
             Console.WriteLine(, watch.ElapsedMilliseconds);

  关键词语及意思如下:

  .Func<object, int>这个是C#新增的特性,这个和Action最大的区别就是Func有返回值,其他的和Action相同任意长度参数个数和类型

  .Task.WaitAll这个方法有几个重载,这里用的是一个超时时间的方法,设置时间后在规定的时间就不继续等待Task【】了,如果task【】在超时时间范围内就执行完了,那么直接通过,不用再等待超时时间

  效果:

  

这里依然有统计时间查问题,忽略

3.分页任务执行方法

 /// <summary>
         /// 批次任务执行方法
         /// </summary>
         /// <typeparam name="T">参数类型</typeparam>
         /// <param name="func">func方法</param>
         /// <param name="list">待执行数据</param>
         /// <param name="taskLen">任务量</param>
         /// <param name="timeOut">任务超时时间 默认30s</param>
         /// <returns></returns>
         , ) where T : class
         {
             ;
             //任务量
             var tasks = new Task<int>[taskLen];
              ?  : );  //每个分得得需要执行的总条数 最有一个执行剩余所有
             ; ji <= taskLen; ji++)
             {
                 //使用分页方法获取待执行数据
                 ) * page).Take(page).ToList();
                 ) { break; }
                 var task = Task.Run(() =>
                 {

                     return func(list01);
                 });
                 tasks[ji - ] = task;
             }
             //等待执行
             Task.WaitAll(tasks,  *  * timeOut);
             //获取执行成功条数
             result = tasks.Where(b => b.IsCompleted).Sum(b => b.Result);

             return result;
         }

  测试代码:

 /// <summary>
         /// 测试执行底层数据方法
         /// </summary>
         /// <param name="list"></param>
         /// <returns></returns>
         static int _FuncTest(List<string> list)
         {

             foreach (var item in list)
             {
                 Thread.Sleep( * );
                 Console.WriteLine("TaskId:{1}输出第{0}个值", item, Task.CurrentId);
             }
             return list.Count;
         }
 //分页任务执行方法
             var listT = new List<string>();
             ; _i < ; _i++)
             {
                 listT.Add(_i.ToString());
             }
             watch.Restart();
             //调用任务公共方法
             );
             watch.Stop();
             Console.WriteLine("待处理数据:{0}条,共处理成功数据:{1}条,使用时间:{2}ms", listT.Count, result, watch.ElapsedMilliseconds);

  这里使用的是分页的原理,把参数集合分发到创建的Task中,使用Task【】来处理这些数据,这里和第二个例子有点相识就多了分页写法而已,最后统计执行成功的条数,以此来返回给调用者,方便记录日志,此方法目前是我经常使用的,不知道是否还有更好的,各位多多分享,谢谢。

  效果图:

  

  以上就是这次的总结,希望多同学们有些帮助,有疑问或者问题请及时相互交流。

Task三个列子的分享的更多相关文章

  1. 第三记“晋IT”分享成长沙龙

    2014年8月17日下午4点-7点,第三期"晋IT"分享成长沙龙在太原大自然蒙特梭利幼儿园多功能厅成功举办. 8月17日下午两点.小编领先来到场地,提前探訪一下准备情况. &quo ...

  2. Hive快捷查询:不启用Mapreduce job启用Fetch task三种方式介绍

    如果查询表的某一列,Hive中默认会启用MapReduce job来完成这个任务,如下: hive>select id,name from m limit 10;--执行时hive会启用MapR ...

  3. php正则表达式的三个最基本原则分享

    我个人认为,正则表达式的常规用法可以分为如下三个最基本的原则:1.找谁.2.怎么找.3.找它干什么. 接下来,我分享一下一个正则表达式分三个部分: 原子字符 . 匹配除换行符以外的任意字符 \w 匹配 ...

  4. 011-HQL中级1-Hive快捷查询:不启用Mapreduce job启用Fetch task三种方式介绍

    如果你想查询某个表的某一列,Hive默认是会启用MapReduce Job来完成这个任务,如下: hive; Total MapReduce jobs Launching Job out since ...

  5. [DeviceOne开发]-土地销售项目源码分享

    一.简介 这个是一个真实项目开源,虽然不是很花哨,但是中规中矩,小细节处理的也很好,非常值得参考和借鉴.里面的数据都缓存到本地,可以离线运行,但是调整一下代码,马上就可以和服务端完全对接.后续会有详细 ...

  6. iOS----友盟分享完善版本

    分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...

  7. React Native微信分享 朋友圈分享 Android/iOS 通用

    超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用   2016/06/16 |  React Native技术文章 |  Sky丶清|  暂无评论 |  1 ...

  8. wcf系列学习5天速成——第三天 分布性事务的使用 有时间再验证下 不同库的操作

    原文地址:http://www.cnblogs.com/huangxincheng/archive/2011/11/06/2238273.html 今天是速成的第三天,再分享一下WCF中比较常用的一种 ...

  9. wcf系列学习5天速成——第三天 事务的使用

    今天是速成的第三天,再分享一下WCF中比较常用的一种技术,也就是”事务“. 在B2B的项目中,一般用户注册后,就有一个属于自己的店铺,此时,我们就要插入两张表, User和Shop表. 当然,要么插入 ...

随机推荐

  1. XPath的使用

    最近在mybatis的时候,发现源码中出现了这样的一句代码 private void configurationElement(XNode context) { try { String namesp ...

  2. 地球上最大的PHP站点 后端技术解密

    Facebook的扩展性挑战 在我们讨论细节之前,这里有一些Facebook已经做的软件规模: ◆Facebook有570000000000每月页面浏览量 (据Google Ad Planner) ◆ ...

  3. Ubuntu系统的修改Hosts

    1.修改hostssudo gedit /etc/hosts2.添加解析记录( . )完整案例:127.0.0.1 localhost.localdomain localhost简洁记录:127.0. ...

  4. android让你的TabHost滑动起来

    在Android应用中,一般TabActivity和若干个Tab选项卡(TabWidget).如果选项卡的数量超过了5个,就不适合放到一个屏幕中,这样可以让这些选项卡滑动起来. 滑动的选项卡的实现有好 ...

  5. c语言_常见图片格式判断

    c语言_常见图片格式判断 我想尽各种思路.今天,终于把图片判断搞定了. 在此,我写一下我的思路.希望对那些不想看代码的朋友们有帮助. 常风的的图片格式有:bmp,png,jpg,gif等图片格式. 我 ...

  6. linux内核数据包转发流程(三)网卡帧接收分析

    [版权声明:转载请保留出处:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧,都有其数据结构来处理入口和出口流量,因此,不 ...

  7. Docker contanier comunication with route

    2台宿主机,hslave1 192.168.1.153, hslave2 192.168.1.154 修改网段 docker0默认网段是172.17.0.0/16,修改154机器的docker0的网段 ...

  8. myeclipse连接hadoop集群编程及问题解决

    原以为搭建一个本地编程测试hadoop程序的环境很简单,没想到还是做得焦头烂额,在此分享步骤和遇到的问题,希望大家顺利. 一.要实现连接hadoop集群并能够编码的目的需要做如下准备: 1.远程had ...

  9. 【canvas学习笔记二】绘制图形

    上一篇我们已经讲述了canvas的基本用法,学会了构建canvas环境.现在我们就来学习绘制一些基本图形. 坐标 canvas的坐标原点在左上角,从左到右X轴坐标增加,从上到下Y轴坐标增加.坐标的一个 ...

  10. Win和Linux查看端口和杀死进程

    title: Win和Linux查看端口和杀死进程 date: 2017-7-30 tags: null categories: Linux --- 本文介绍Windows和Linux下查看端口和杀死 ...