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 , ...
随机推荐
- 理解Java中的接口
一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...
- 输入的全角字符转换成半角字符--css、js、ASP.NET
我们经常需要用户在表单中输入数字,用户不小心使用了全角状态输入数字,但是在程序中全角的数字是不能直接转换为数字的.这种全角数字的错误处理起来就有些麻烦了.对一些没有经验用户来说明明已经输入数字了,怎么 ...
- 淘宝(阿里百川)手机客户端开发日记第七篇 Service,Handler和Thread
现在我们已经已经知道android有Service,Handler和Thread这些内容了,但是我想应该还有很多人对此并不是很清楚他们之间的区别! (1)Service 是运行在后端的程序,不与UI直 ...
- [Effective JavaScript 笔记]第39条:不要重用父类的属性名
假设想给上节讲的场景图库添加收集诊断信息的功能.这对于调试和性能分析很有用. 38条示例续 给每个Actor实例一个唯一的标识数. 添加标识数 function Actor(scene,x,y){ t ...
- web api 解决跨域的问题
web api 总是会遇到跨域的问题,今天我找到了如下方法解决跨域: 1: a:在配置文件中的 加上如下代码 <system.webServer> <httpProtocol> ...
- php友好格式化时间
php格式化时间显示 function toTime($time) {//$time必须为时间戳 $rtime = date("Y-m-d H:i",$time); $htime ...
- N-Queens | & N-Queens II
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
- 使用clssneme改变图片或样式
<title>使用className改变样式</title> <style type="text/css"> li{ font-size: 12 ...
- python中的引用
作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘. 首先背书python中的引用对象问题: 1. python不允许程序员选择采 ...
- codeforces A. New Year Candles 解题报告
题目链接:http://codeforces.com/problemset/problem/379/A 题目意思:给定a支蜡烛(每支蜡烛可以燃烧1小时),可以在燃尽的a支蜡烛中看能组成多少组b支蜡烛, ...