/// <summary> /// 批量运行任务(限制线程大小) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <param name="param"></param> public static void RunTaskLimite <T>(List <T> list, TaskParam <T> param) { if (param.Method == null) { throw new Exception("Func字段没赋值"); } if (param.MaxThread < 1) { throw new Exception("MaxThread不能小于1"); } //在2秒内没有返回值时再次通知 var continuTime = 2000; var running = new List <Task>(); var complete = 0; var record = new Dictionary <int, T>(); foreach (var item in list) { var t = Task.Run(() => param.Method?.Invoke(item)); record.Add(t.Id, item); running.Add(t); //进度通知 param.Report?.Invoke(ReportTypeEnum.Start, complete, complete + running.Count, item, 0); if (param.Sleep > 0) { Thread.Sleep(param.Sleep); //处理已完成进度 complete = Complete(param, running, record, complete); } if (running.Count < param.MaxThread) { continue; } //等待循环 Wait(param, running, record, complete, continuTime); //处理已完成进度 complete = Complete(param, running, record, complete); } //列表已经循环结束了,但任务还有等待完成的 while (running.Count > 0) { //等待循环 Wait(param, running, record, complete, continuTime); //处理已完成进度 complete = Complete(param, running, record, complete); } }
/// <summary> /// 等待循环 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TReturn"></typeparam> /// <param name="param"></param> /// <param name="running"></param> /// <param name="record"></param> /// <param name="complete"></param> /// <param name="continuTime"></param> private static void Wait <T, TReturn>(TaskParam <T, TReturn> param, List <Task <TReturn> > running, Dictionary <int, T> record, List <Task <TReturn> > complete, int continuTime) { var newItem = record[running[0].Id]; var num = 0; while (true) { //等待是每2秒返回一次通知,取正在进行中的第一个 param.Report?.Invoke(ReportTypeEnum.Wait, complete.Count, complete.Count + running.Count, newItem, num); num++; var obj = Task.WhenAny(running.ToArray()).SetTimeoutResult2(continuTime); if (!obj.IsTimeout) { break; } } }
/// <summary> /// 处理已完成进度 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TReturn"></typeparam> /// <param name="param"></param> /// <param name="running"></param> /// <param name="record"></param> /// <param name="complete"></param> private static void Complete <T, TReturn>(TaskParam <T, TReturn> param, List <Task <TReturn> > running, Dictionary <int, T> record, List <Task <TReturn> > complete) { var res = running.Where(p => p.IsCanceled || p.IsCompleted || p.IsFaulted).ToList(); if (res.Count <= 0) { return; } complete.AddRange(res); foreach (var r in res) { running.Remove(r); } //进度通知 param.Report?.Invoke(ReportTypeEnum.Finished, complete.Count, complete.Count + running.Count, record[res[0].Id], 0); }
/// <summary> /// 处理已完成进度 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="param"></param> /// <param name="running"></param> /// <param name="record"></param> /// <param name="complete"></param> /// <returns></returns> private static int Complete <T>(TaskParam <T> param, List <Task> running, Dictionary <int, T> record, int complete) { var res = running.Where(p => p.IsCanceled || p.IsCompleted || p.IsFaulted).ToList(); if (res.Count <= 0) { return(complete); } complete += res.Count; foreach (var r in res) { running.Remove(r); } //进度通知 param.Report?.Invoke(ReportTypeEnum.Finished, complete, complete + running.Count, record[res[0].Id], 0); return(complete); }
/// <summary> /// 批量运行任务(限制线程大小) /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TReturn"></typeparam> /// <param name="list"></param> /// <param name="param"></param> public static List <KeyValue <T, TReturn> > RunTaskLimite <T, TReturn>(this List <T> list, TaskParam <T, TReturn> param) { return(TaskHelper.RunTaskLimite(list, param)); }
/// <summary> /// 批量运行任务(限制线程大小) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <param name="param"></param> public static void RunTaskLimite <T>(this List <T> list, TaskParam <T> param) { TaskHelper.RunTaskLimite(list, param); }
/// <summary> /// 批量运行任务(限制线程大小) /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TReturn"></typeparam> /// <param name="list"></param> /// <param name="param"></param> public static List <KeyValue <T, TReturn> > RunTaskLimite <T, TReturn>(List <T> list, TaskParam <T, TReturn> param) { if (param.Method == null) { throw new Exception("Func字段没赋值"); } if (param.MaxThread < 1) { throw new Exception("MaxThread不能小于1"); } //在2秒内没有返回值时再次通知 var continuTime = 2000; var running = new List <Task <TReturn> >(); var complete = new List <Task <TReturn> >(); var record = new Dictionary <int, T>(); foreach (var item in list) { var t = Task.Run(() => param.Method.Invoke(item)); record.Add(t.Id, item); running.Add(t); //进度通知 param.Report?.Invoke(ReportTypeEnum.Start, complete.Count, complete.Count + running.Count, item, 0); if (param.Sleep > 0) { Thread.Sleep(param.Sleep); //处理已完成进度 Complete(param, running, record, complete); } if (running.Count < param.MaxThread) { continue; } //等待循环 Wait(param, running, record, complete, continuTime); //处理已完成进度 Complete(param, running, record, complete); } //列表已经循环结束了,但任务还有等待完成的 while (running.Count > 0) { //等待循环 Wait(param, running, record, complete, continuTime); //处理已完成进度 Complete(param, running, record, complete); } return(record.Join(complete, p => p.Key, p => p.Id, (p, q) => new KeyValue <T, TReturn>() { Key = p.Value, Value = q.Result, }).ToList()); }