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);
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。