Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
        /// <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;
                }
            }
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
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);
        }
Beispiel #5
0
 /// <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));
 }
Beispiel #6
0
 /// <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);
 }
Beispiel #7
0
        /// <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());
        }