Task 实现多线程的模板
1.Task多线程简单模板
- using System;
- using System.Collections.Generic;
- using System.Threading.Tasks;
- namespace Exercises
- {
- public
class GroupInfo - {
- public
string GroupId { get; set; } - public
string Data { get; set; } - }
- public
class MutilTaskTemplate - {
- //执行此方法,可以看到效果
- public
void Test() - {
- Run();
- }
- public IEnumerable<GroupInfo> GetGroupInfos()
- {
- return
new List<GroupInfo>() { - new GroupInfo(){ GroupId = Guid.NewGuid().ToString(), Data = "what!"},
- new GroupInfo(){ GroupId = Guid.NewGuid().ToString(), Data = "hello!"},
- new GroupInfo(){ GroupId = Guid.NewGuid().ToString(), Data = "world!"},
- new GroupInfo(){ GroupId = Guid.NewGuid().ToString(), Data = "hehe!"}
- };
- }
- public
void Run() - {
- Console.WriteLine("start!");
- var groupInfos = GetGroupInfos();
- List<Task> groupInfoTasks = new List<Task>();
- foreach (var groupInfo in groupInfos)
- {
- var task = new Task((inGroupInfo) =>
- {
- ForEveryGroup(inGroupInfo as GroupInfo);
- }, groupInfo);
- groupInfoTasks.Add(task);
- }
- Parallel.ForEach(groupInfoTasks, (t) => { t.Start(); });
- Task.WaitAll(groupInfoTasks.ToArray());
- Console.WriteLine("over!");
- }
- private
void ForEveryGroup(GroupInfo groupInfo) - {
- Console.WriteLine();
- Console.WriteLine(groupInfo.GroupId);
- //use the groupInfo.Data;
- Console.WriteLine(groupInfo.Data);
- }
- }
- }
执行结果:

2.Task多线程带子线程模板
- using System;
- using System.Collections.Generic;
- using System.Threading.Tasks;
- using System.Linq;
- namespace Exercises
- {
- public
class GroupInfo2 - {
- public
string GroupId { get; set; } - public List<RealData> Datas { get; set; }
- }
- public
class RealData - {
- public RealData(string name, int age)
- {
- this.Name = name;
- this.Age = age;
- }
- public
string Name { get; set; } - public
int Age { get; set; } - }
- public
class MutilTaskWithSubTaskTemplate - {
- //执行此方法,可以看到效果
- public
void Test() - {
- Run();
- }
- public IEnumerable<GroupInfo2> GetGroupInfos()
- {
- return
new List<GroupInfo2>() { - new GroupInfo2(){ GroupId = Guid.NewGuid().ToString(), Datas = new List<RealData>(){
- new RealData("daniu",26),new RealData("daniu2",27),new RealData("daniu3",28)} },
- new GroupInfo2(){ GroupId = Guid.NewGuid().ToString(), Datas = new List<RealData>(){
- new RealData("pzdn",26),new RealData("pzdn2",27)} },
- new GroupInfo2(){ GroupId = Guid.NewGuid().ToString(), Datas = new List<RealData>(){
- new RealData("pozi",26),new RealData("pozi2",27),new RealData("pozi3",28)} },
- new GroupInfo2(){ GroupId = Guid.NewGuid().ToString(), Datas = new List<RealData>(){
- new RealData("douzi",26),new RealData("douzi2",27),new RealData("douzi3",28)} }
- };
- }
- public
void Run() - {
- Console.WriteLine("start!");
- var groupInfos = GetGroupInfos();
- int splitNumber = 2; //2条数据一个Task,改变此数值,则可以控制每条子线程的执行数据量
- List<Task> groupInfoTasks = new List<Task>();
- foreach (var groupInfo in groupInfos)
- {
- var task = new Task((inGroupInfo) =>
- {
- int remainData = groupInfo.Datas.Count % splitNumber;
- int splits = groupInfo.Datas.Count / splitNumber + (remainData != 0 ? 1 : 0);
- var tmpGroupInfo = inGroupInfo as GroupInfo2;
- for (int i = 0; i < splits; i++)
- {
- bool flag = (i == splits - 1) && remainData != 0;
- //当前分组的子线程
- var subTask = new Task((inList) =>
- {
- ForEveryGroup(groupInfo.GroupId, inList as IEnumerable<RealData>);
- }, tmpGroupInfo.Datas.Skip(splitNumber * i).Take(flag ? remainData : splitNumber), TaskCreationOptions.AttachedToParent);
- subTask.Start();
- }
- }, groupInfo);
- groupInfoTasks.Add(task);
- }
- Parallel.ForEach(groupInfoTasks, (t) => { t.Start(); });
- try
- {
- Task.WaitAll(groupInfoTasks.ToArray());
- }
- catch (AggregateException e) //AggregateException可以捕获运行中出现的错误
- {
- Console.WriteLine("Caught Exception:" + e.InnerException.Message); //这里显示
- }
- Console.WriteLine("over!");
- }
- private
void ForEveryGroup(string groupId, IEnumerable<RealData> realDatas) - {
- Console.WriteLine(groupId);
- //use the groupInfo.Data;
- Console.WriteLine(realDatas == null);
- foreach (var item in realDatas)
- {
- Console.WriteLine(item.Name + "-" + item.Age);
- }
- }
- }
- }
执行结果:

3.加入超时
可以增加一个等待超时的字段,在Task.WaitAll(groupInfoTasks.ToArray(),timeOut);
Task 实现多线程的模板的更多相关文章
- HTML5触屏版多线程渲染模板技术分享
前言: 了解js编译原理的屌丝们都知道,js是单线程的,想当年各路神仙为了实现js的多线程,为了解决innerHTML输出大段HTML卡页面的顽疾,纷纷设计了诸如假冒的“多线程“实现,我自己也在写开源 ...
- C# -- 使用 Task 执行多线程任务
C# -- 使用 Task 执行多线程任务 1. 使用 Task 执行多线程任务 class Program { static void Main(string[] args) { Task task ...
- Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别
Task C# 多线程和异步模型 TPL模型 Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...
- 基于Task的多线程
/// <summary> /// 基于Task的多线程 /// </summary> public class Tasks { public static void Task ...
- 大数据学习day22------spark05------1. 学科最受欢迎老师解法补充 2. 自定义排序 3. spark任务执行过程 4. SparkTask的分类 5. Task的序列化 6. Task的多线程问题
1. 学科最受欢迎老师解法补充 day21中该案例的解法四还有一个问题,就是当各个老师受欢迎度是一样的时候,其排序规则就处理不了,以下是对其优化的解法 实现方式五 FavoriteTeacher5 p ...
- Task+ConcurrentQueue多线程编程
队列(Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队. ConcurrentQueue< ...
- Task C# 多线程和异步模型 TPL模型
Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task TaskCompletionSource 更通用, ...
- 【转】【C#】【Thread】【Task】多线程
多线程 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回 ...
- HDU 3572 Task Schedule(ISAP模板&&最大流问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3572 题意:m台机器.须要做n个任务. 第i个任务.你须要使用机器Pi天,且这个任务要在[Si , ...
随机推荐
- Linux下建立软链接
实例:ln -s /home/gamestat /gamestat Linux下的软链接类似于windows下的快捷方式 ln -s a b 中的 a 就是源文件,b是链接文件名,其作用是当进入 ...
- Python 常用函数大体分类
==================系统库函数================ 字符串函数 举例数学函数 import math val=math.sin(3.14/6) val=math.sin(m ...
- MYSQL注入天书之HTTP头部介绍
Background-5 HTTP头部介绍 在利用抓包工具进行抓包的时候,我们能看到很多的项,下面详细讲解每一项. HTTP头部详解 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* ...
- nginx学习(二):初识配置文件
nginx的配置文件默认在nginx安装目录中的conf子目录中,主配置文件为nginx.conf, root@mgmserver conf]# pwd/usr/local/nginx/conf一.配 ...
- Java正则表达式的最简单应用
String emailRegex = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; Pattern pat = ...
- 用Python操纵MySQL
本例用Python操纵MySQL,从指定文件读取数据,并对数据进行处理,处理之后批量插入MySQL. 贴上代码: # -*- coding: gbk -*- import re import MySQ ...
- 36.在字符串中删除特定的字符[Delete source from dest]
[题目] 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”. ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- 将文件放到Android模拟器的SD卡
1.打开DDMS页面2.打开File Explorer页,如果没有,在Window –> Show View –>File Explorer3.一般就在mnt –> sdcard中4 ...
- BestCoder9 1003 Revenge of kNN(hdu 4995) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4995 题目意思:在一个一维坐标轴上,给出位置 xi 和值 vi,对于 M 次询问,每次询问给出inde ...