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

1.顺序任务执行

  1. //顺序任务执行
  2. Task.Factory.StartNew<int>(() => { Console.WriteLine(); return ; }).
  3. //等待5s以后才会依次输出2,3
  4. ContinueWith((task) =>
  5. {
  6.  
  7. Stopwatch wt = new Stopwatch();
  8. wt.Start();
  9. Thread.Sleep( * );
  10. wt.Stop();
  11. Console.WriteLine("等待了:{0}ms,输出结果{1}", wt.ElapsedMilliseconds, );
  12. }).
  13. ContinueWith((task) => { Console.WriteLine(); }).
  14. Wait();

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

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

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

  效果图:

  

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

  2.并行任务效果

  1. //并行任务
  2. var watch = new Stopwatch();
  3. //func方法(认知特点:任意长度参数,最后一个的类型是方法返回的返回值类型)
  4. Func<object, int> fun = (num) =>
  5. {
  6. Thread.Sleep( * );
  7. Console.WriteLine("第{0}个", num);
  8. return Convert.ToInt32(num);
  9. };
  10. var len = ;
  11. var tasks = new Task<int>[len];
  12. //开始计算处理时间
  13. watch.Start();
  14. for (int _i = ; _i < len; _i++)
  15. {
  16. //Task.Factory.StartNew直接开启Task任务无需在使用start
  17. tasks[_i] = Task.Factory.StartNew<int>(fun, _i);
  18. }
  19. //10s等待
  20. Task.WaitAll(tasks, * );
  21. watch.Stop();
  22. Console.WriteLine("tasks共使用时间:{0}s={1}ms", watch.ElapsedMilliseconds / , watch.ElapsedMilliseconds);

  关键词语及意思如下:

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

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

  效果:

  

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

3.分页任务执行方法

  1. /// <summary>
  2. /// 批次任务执行方法
  3. /// </summary>
  4. /// <typeparam name="T">参数类型</typeparam>
  5. /// <param name="func">func方法</param>
  6. /// <param name="list">待执行数据</param>
  7. /// <param name="taskLen">任务量</param>
  8. /// <param name="timeOut">任务超时时间 默认30s</param>
  9. /// <returns></returns>
  10. public static int _ExcuteTask<T>(Func<List<T>, int> func, List<T> list, int taskLen = , int timeOut = ) where T : class
  11. {
  12. var result = ;
  13. //任务量
  14. var tasks = new Task<int>[taskLen];
  15. var page = list.Count / taskLen + (list.Count % taskLen > ? : ); //每个分得得需要执行的总条数 最有一个执行剩余所有
  16. for (var ji = ; ji <= taskLen; ji++)
  17. {
  18. //使用分页方法获取待执行数据
  19. var list01 = list.Skip((ji - ) * page).Take(page).ToList();
  20. if (list01.Count <= ) { break; }
  21. var task = Task.Run(() =>
  22. {
  23.  
  24. return func(list01);
  25. });
  26. tasks[ji - ] = task;
  27. }
  28. //等待执行
  29. Task.WaitAll(tasks, * * timeOut);
  30. //获取执行成功条数
  31. result = tasks.Where(b => b.IsCompleted).Sum(b => b.Result);
  32.  
  33. return result;
  34. }

  测试代码:

  1. /// <summary>
  2. /// 测试执行底层数据方法
  3. /// </summary>
  4. /// <param name="list"></param>
  5. /// <returns></returns>
  6. static int _FuncTest(List<string> list)
  7. {
  8.  
  9. foreach (var item in list)
  10. {
  11. Thread.Sleep( * );
  12. Console.WriteLine("TaskId:{1}输出第{0}个值", item, Task.CurrentId);
  13. }
  14. return list.Count;
  15. }
  1. //分页任务执行方法
  2. var listT = new List<string>();
  3. for (int _i = ; _i < ; _i++)
  4. {
  5. listT.Add(_i.ToString());
  6. }
  7. watch.Restart();
  8. //调用任务公共方法
  9. var result = _ExcuteTask(_FuncTest, listT, );
  10. watch.Stop();
  11. 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. 关于C#委托三种调用的分享

    一.同步调用 1.同步调用会按照代码顺序来执行2.同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了. 举个栗子 ...

  6. 春节过后就是金三银四求职季,分享几个Java面试妙招,轻松搞定HR!

    春节过后就是金三银四,分享几个Java面试妙招,轻松搞定HR! 2020年了,先祝大家新年快乐! 今年IT职位依然相当热门,特别是Java开发岗位.软件开发人才在今年将有大量的就业机会.春节过后,金三 ...

  7. Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...

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

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

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

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

随机推荐

  1. 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题

    千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...

  2. CSS 选择器及各样式引用方式

    Css :层叠样式表 (Cascading Style Sheets),定义了如何显示HTML元素. 目录 1. 选择器的分类:介绍ID.class.元素名称.符合.层次.伪类.属性选择器. 2. 样 ...

  3. HTML5 介绍

    本篇主要介绍HTML5规范的内容和页面上的架构变动. 目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> ...

  4. SQL必备知识点

    经典SQL语句大全 基础 1.说明:创建数据库.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 device.说明:创建新表crea ...

  5. javascript之活灵活现的Array

    前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...

  6. UE4新手引导入门教程

    请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf

  7. 如何优化coding

    如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码.如果代码写的好的,不用debug就可以一眼看出来哪里出了问题.实际上,我都要deb ...

  8. .NET平台和C#编程的总结

    第一章   简单认识.NET框架    (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework ...

  9. SOLID 设计原则

    SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...

  10. 浅谈Web自适应

    前言 随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难, ...