Task三个列子的分享
这次要分享的是C#Task任务的几个列子,感觉最实用的是封装的分页任务执行方法,这个方法步奏也是目前在我工作中执行多任务常用的,不知道各位也有这用的情况,那么开始吧。
1.顺序任务执行
//顺序任务执行
Task.Factory.StartNew<int>(() => { Console.WriteLine(); return ; }).
//等待5s以后才会依次输出2,3
ContinueWith((task) =>
{ Stopwatch wt = new Stopwatch();
wt.Start();
Thread.Sleep( * );
wt.Stop();
Console.WriteLine("等待了:{0}ms,输出结果{1}", wt.ElapsedMilliseconds, );
}).
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 len = ;
var tasks = new Task<int>[len];
//开始计算处理时间
watch.Start();
for (int _i = ; _i < len; _i++)
{
//Task.Factory.StartNew直接开启Task任务无需在使用start
tasks[_i] = Task.Factory.StartNew<int>(fun, _i);
}
//10s等待
Task.WaitAll(tasks, * );
watch.Stop();
Console.WriteLine("tasks共使用时间:{0}s={1}ms", watch.ElapsedMilliseconds / , 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>
public static int _ExcuteTask<T>(Func<List<T>, int> func, List<T> list, int taskLen = , int timeOut = ) where T : class
{
var result = ;
//任务量
var tasks = new Task<int>[taskLen];
var page = list.Count / taskLen + (list.Count % taskLen > ? : ); //每个分得得需要执行的总条数 最有一个执行剩余所有
for (var ji = ; ji <= taskLen; ji++)
{
//使用分页方法获取待执行数据
var list01 = list.Skip((ji - ) * page).Take(page).ToList();
if (list01.Count <= ) { 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>();
for (int _i = ; _i < ; _i++)
{
listT.Add(_i.ToString());
}
watch.Restart();
//调用任务公共方法
var result = _ExcuteTask(_FuncTest, listT, );
watch.Stop();
Console.WriteLine("待处理数据:{0}条,共处理成功数据:{1}条,使用时间:{2}ms", listT.Count, result, watch.ElapsedMilliseconds);
这里使用的是分页的原理,把参数集合分发到创建的Task中,使用Task【】来处理这些数据,这里和第二个例子有点相识就多了分页写法而已,最后统计执行成功的条数,以此来返回给调用者,方便记录日志,此方法目前是我经常使用的,不知道是否还有更好的,各位多多分享,谢谢。
效果图:
以上就是这次的总结,希望多同学们有些帮助,有疑问或者问题请及时相互交流。
Task三个列子的分享的更多相关文章
- 第三记“晋IT”分享成长沙龙
2014年8月17日下午4点-7点,第三期"晋IT"分享成长沙龙在太原大自然蒙特梭利幼儿园多功能厅成功举办. 8月17日下午两点.小编领先来到场地,提前探訪一下准备情况. &quo ...
- Hive快捷查询:不启用Mapreduce job启用Fetch task三种方式介绍
如果查询表的某一列,Hive中默认会启用MapReduce job来完成这个任务,如下: hive>select id,name from m limit 10;--执行时hive会启用MapR ...
- php正则表达式的三个最基本原则分享
我个人认为,正则表达式的常规用法可以分为如下三个最基本的原则:1.找谁.2.怎么找.3.找它干什么. 接下来,我分享一下一个正则表达式分三个部分: 原子字符 . 匹配除换行符以外的任意字符 \w 匹配 ...
- 011-HQL中级1-Hive快捷查询:不启用Mapreduce job启用Fetch task三种方式介绍
如果你想查询某个表的某一列,Hive默认是会启用MapReduce Job来完成这个任务,如下: hive; Total MapReduce jobs Launching Job out since ...
- 关于C#委托三种调用的分享
一.同步调用 1.同步调用会按照代码顺序来执行2.同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了. 举个栗子 ...
- 春节过后就是金三银四求职季,分享几个Java面试妙招,轻松搞定HR!
春节过后就是金三银四,分享几个Java面试妙招,轻松搞定HR! 2020年了,先祝大家新年快乐! 今年IT职位依然相当热门,特别是Java开发岗位.软件开发人才在今年将有大量的就业机会.春节过后,金三 ...
- Python实现定时执行任务的三种方式简单示例
本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...
- [DeviceOne开发]-土地销售项目源码分享
一.简介 这个是一个真实项目开源,虽然不是很花哨,但是中规中矩,小细节处理的也很好,非常值得参考和借鉴.里面的数据都缓存到本地,可以离线运行,但是调整一下代码,马上就可以和服务端完全对接.后续会有详细 ...
- iOS----友盟分享完善版本
分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...
随机推荐
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 来吧,HTML5之基础标签(下)
<dialog> 标签 定义对话框或窗口. <dialog> 标签是 HTML 5 的新标签.目前只有 Chrome 和 Safari 6 支持 <dialog> ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- C# salt+hash 加密
一.先明确几个基本概念 1.伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的.伪随机数并不是假随机 数,这里的" ...
- ntp
一: 在一台可以连接外网的服务器A上配置ntp: 配置 /etc/ntp.conf 文件: server 202.120.2.101 # local clock (LCL) ...
- RSA算法
RSA.h #ifndef _RSA_H #define _RSA_H #include<stdio.h> #include<iostream> #include<mat ...
- 安装angular-cli
最近在学习angular2,并尝试用这个框架来做公司的一个新项目. 终于要开始开发了,等了1个多月. 因为第一次用这个新框架做项目,不太熟悉,就找了angular-cli这个脚手架来搭建项目. 安装了 ...
- 如何理解javaSript中函数的参数是按值传递
本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...
- Mysql - 数据库操作
之前介绍了数据库的增删改查, 发现忘记了数据库的一些基本操作, 比如建库, 建表, 改表等等. 那这里就来小结一下数据库sql形式的基本操作. 一.库操作 1. 建库 在建库之前, 可能需要看一下, ...