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 , ...
随机推荐
- django-cms 代码研究(五)深入(代码结构)
前言: 前戏已经做得比较充分了,下面我们开始步入正题. 代码结构: cms |--admin (猜测是admin界面的二次开发和改良) |--cache (猜测是缓存机制的处理) |--extensi ...
- 什么是iis服务器
IS 是Internet Information Server的缩写,它是微软公司主推的服务器,最新的版本是Windows2003里面包含的IIS 6.0,IIS与WindowNT Server完全集 ...
- Maximum Gap
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- Unique Paths | & ||
Unique Paths I A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diag ...
- eclipse 启动后,啥也不干,就一直在loading descriptor for XXX (XXX为工程名),,其他什么操作都不能操作。 如下图所示,保存文件也无法保存。 这个怎么办?一年好几天,什么都干不了!!!!!
解决办法: 解决办法是 断一下网就好了
- 3.子数组的最大和[MaximumContinuousSubArray]
[题目]: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值,要求时间复杂度为O(n). 例如输入的数组为1, -2, ...
- 用php计算行列式
因为有课程设计要计算多元一次方程组,所以想编个程序实现,多元一次方程组的计算最系统的方法就是利用克拉默法则求解方程组,所以只需要编写一个类或者方法求出多元一次方程组系数行列式的值和和其他几个行列式,如 ...
- codeforces C1. The Great Julya Calendar 解题报告
题目链接:http://codeforces.com/problemset/problem/331/C1 这是第一次参加codeforces比赛(ABBYY Cup 3.0 - Finals (onl ...
- 好玩儿的expect
前言 1> 借鉴里面的应用思想,使用断言提高代码的健壮性及维护性 2> 实现方式——不采用直接嵌入expect的方式,统一进行重写(提取常用断言方法,重新构造API) 官网介绍 https ...
- SELECT的解析顺序及慢查询优化
标准的 SQL 的解析顺序为:(1)FROM 子句, 组装来自不同数据源的数据(2)WHERE 子句, 基于指定的条件对记录进行筛选(3)GROUP BY 子句, 将数据划分为多个分组(4)使用聚合函 ...