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 , ...
随机推荐
- scp 命令
复制文件: (1)将本地文件拷贝到远程 scp 文件名 用户名@计算机IP或者计算机名称:远程路径 (2)从远程将文件拷回本地 ...
- 腾讯新浪通过IP地址获取当前地理位置(省份)的接口
腾讯新浪通过IP地址获取当前地理位置(省份)的接口 腾讯的接口是 ,返回数组 http://fw.qq.com/ipaddress 返回值 var IPData = new Array(" ...
- Count Numbers with Unique Digits
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...
- Expected MultipartHttpServletRequest: is a MultipartResolver configured?
2015-05-05 19:09:47.510::WARN: /purchase/long-term-contract/uploading.htmjava.lang.IllegalArgumentEx ...
- (转)SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
六.各种事务隔离级别发生的影响 修改数据的用户会影响同时读取或修改相同数据的其他用户.即这些用户可以并发访问数据.如果数据存储系统没有并发控制,则用户可能会看到以下负面影响: · 未提交的依赖关系(脏 ...
- 转数据库分库分表(sharding)系列(二) 全局主键生成策略
本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...
- sqlserver 中的NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX
1.NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁. 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Rol ...
- Transfer-Encoding: chunked
Http1.1中 使用 chunked 编码传送时 没有CONTENT_LENGTH,下载之前无法确定要下载的大小. Wininet中已经内嵌该传输协议,要查看chunked块的大小只能socket底 ...
- codeforces 459C Pashmak and Buses 解题报告
题目链接:http://codeforces.com/problemset/problem/459/C 题目意思:有 n 个 students,k 辆 buses.问是否能对 n 个students安 ...
- [] ubuntu 14.04 搜狗拼音输入法安装
1.需要现在ubuntu下安装fcitx和libssh2-1命令如下 sudo apt-get install fcitx sudo apt-get install libssh2-1 注意最好是先卸 ...