コード例 #1
0
        public void ExecuteDatas()
        {
            var            etls  = CurrentETLTools.Take(ETLMount).Where(d => d.Enabled).ToList();
            EnumerableFunc func  = d => d;
            var            index = 0;


            if (GenerateMode == GenerateMode.串行模式)
            {
                var generator = etls.FirstOrDefault() as IColumnGenerator;
                if (generator == null)
                {
                    return;
                }
                var realfunc3 = Aggregate(func, etls.Skip(1), true);
                var task      = TemporaryTask.AddTempTask(Name + "串行任务", generator.Generate(),
                                                          d => { realfunc3(new List <IFreeDocument> {
                        d
                    }).ToList(); }, null, generator.GenerateCount() ?? (-1));
                SysProcessManager.CurrentProcessTasks.Add(task);
            }
            else
            {
                var           timer             = new DispatcherTimer();
                TemporaryTask paratask          = null;
                var           tolistTransformer = etls.FirstOrDefault(d => d.TypeName == "启动并行") as ToListTF;

                if (tolistTransformer != null)
                {
                    index = etls.IndexOf(tolistTransformer);

                    var beforefunc = Aggregate(func, etls.Take(index), true);
                    List <IFreeDocument> taskbuff = new List <IFreeDocument>();
                    paratask = TemporaryTask.AddTempTask("清洗任务并行化", beforefunc(new List <IFreeDocument>())
                                                         ,
                                                         d2 =>
                    {    //TODO:这种分组方式可能会丢数据!!
                        if (taskbuff.Count < tolistTransformer.GroupMount)
                        {
                            taskbuff.Add(d2);
                            return;
                        }
                        var newtaskbuff = taskbuff.ToList();
                        taskbuff.Clear();
                        if (paratask.IsPause == false &&
                            SysProcessManager.CurrentProcessTasks.Count > MaxThreadCount)
                        {
                            iswait           = true;
                            paratask.IsPause = true;
                        }
                        var countstr = d2.Query(tolistTransformer.MountColumn);
                        var name     = d2.Query(tolistTransformer.IDColumn);
                        if (name == null)
                        {
                            name = "清洗任务";
                        }

                        var rcount = -1;
                        int.TryParse(countstr, out rcount);
                        var afterfunc = Aggregate(func, etls.Skip(index + 1), true);
                        var task      = TemporaryTask.AddTempTask(name, afterfunc(newtaskbuff), d => { },
                                                                  null, rcount, false);
                        if (tolistTransformer.DisplayProgress)
                        {
                            ControlExtended.UIInvoke(() => SysProcessManager.CurrentProcessTasks.Add(task));
                        }
                        task.Start();
                    }, d => timer.Stop(), -1, false);
                }
                else
                {
                    var generator = etls.FirstOrDefault() as IColumnGenerator;
                    if (generator == null)
                    {
                        return;
                    }
                    var realfunc3 = Aggregate(func, etls.Skip(1), true);
                    paratask = TemporaryTask.AddTempTask("并行清洗任务", generator.Generate(),
                                                         d =>
                    {
                        if (paratask.IsPause == false &&
                            SysProcessManager.CurrentProcessTasks.Count > MaxThreadCount)
                        {
                            iswait           = true;
                            paratask.IsPause = true;
                        }
                        var task = TemporaryTask.AddTempTask("子任务", realfunc3(new List <IFreeDocument> {
                            d
                        }),
                                                             d2 => { },
                                                             null, 1, false);
                        ControlExtended.UIInvoke(() => SysProcessManager.CurrentProcessTasks.Add(task));
                        task.Start();
                    }, d => timer.Stop(), generator.GenerateCount() ?? (-1), false);
                }
                SysProcessManager.CurrentProcessTasks.Add(paratask);

                timer.Interval = TimeSpan.FromSeconds(3);
                timer.Tick    += (s, e) =>
                {
                    if (paratask.IsCanceled)
                    {
                        timer.Stop();
                        return;
                    }


                    if (paratask.IsStart == false)
                    {
                        paratask.Start();
                        return;
                    }

                    if (iswait && SysProcessManager.CurrentProcessTasks.Count < MaxThreadCount)
                    {
                        paratask.IsPause = false;
                        iswait           = false;
                    }
                };

                timer.Start();
            }
        }