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);
????????}
????}
}
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);
????????????}
????????}
????}
}