Ejemplo n.º 1
0
 private void ExecuteGroup(object state)
 {
     if (stopEngine)
     {
         return;
     }
     ExecutableThread.GroupThreadParam param = state as ExecutableThread.GroupThreadParam;
     if (param == null)
     {
         return;
     }
     foreach (ExecutableThread.ThreadParam threadParam in param.ThreadParams)
     {
         this.Execute(threadParam);
     }
 }
Ejemplo n.º 2
0
        /// <summary>
        /// این تابع وظیفه اجرای قوانین برای تماممی اشخاصی که محاسباتشان نامعتبر است را برعهده دارد
        /// همجنین تنها توسط سرویس ویندوزی اجرا میگردد
        /// </summary>
        /// <param name="toDate"></param>
        public void ExecuteByRobot(string CallerIdentity, DateTime toDate)
        {
            try
            {
                IList <ExecutablePersonCalculation> MustExecuted = ExecutablePersonCalculation.GetExecutablePersonCalcRepositoy(false).GetAll(toDate);
                ThreadHelper.CleanupThreads();
                IList <ExecutablePersonCalculation> Threads = ThreadHelper.AddThreads(CallerIdentity, MustExecuted, this.FinishedCallback);
                logger.Logger.Info(
                    string.Format("ExecuteByRobot start at '{0}', Total Thread Count: '{1}', Executable Thread Count: '{2}', Runing Thread Count: '{3}'", DateTime.Now.ToShortDateString()
                                  , ThreadHelper.TotalThreadCount
                                  , ThreadHelper.TotalThreadCount - ThreadHelper.TotalExecutingThreadCount
                                  , ThreadHelper.TotalExecutingThreadCount));
                logger.Flush();


                IList <Action> actions         = new List <Action>();
                int            threadGroupSize = Threads.Count / MaxThread;
                if (Threads.Count % MaxThread > 0)
                {
                    MaxThread++;
                }
                var groupThreadParams = new ExecutableThread.GroupThreadParam[MaxThread];
                for (int i = 0; i < MaxThread; i++)
                {
                    //if (Utility.CpuUsage < MaxCPUUsage)
                    //{
                    groupThreadParams[i] = new ExecutableThread.GroupThreadParam();
                    Threads.Skip(threadGroupSize * i).Take(threadGroupSize).ToList().ForEach((item) =>
                    {
                        item.ToDate = toDate;
                        var param   = ThreadHelper.PrepareToExecute(CallerIdentity, item);
                        if (param != null)
                        {
                            param.ExecuteByRobot = true;
                            groupThreadParams[i].ThreadParams.Add(param);
                        }
                    });
                    //}
                    //else
                    //{
                    //    cpuUsageExtraCount++;
                    //    ThreadHelper.RemoveThread(CallerIdentity, item.PersonId);
                    //}
                }

                groupThreadParams.ToList().ForEach((threadParams) => {
                    Task.Factory.StartNew(() => { ExecuteGroup(threadParams); });
                });
                //Task.Factory.StartNew(() => Parallel.Invoke(
                //                           new ParallelOptions() { MaxDegreeOfParallelism = MaxThread },
                //                           actions.ToArray()));

                //if (cpuUsageExtraCount > 0)
                //{
                //    logger.Info("ExecuteByRobot", String.Format("عدم اجرا تعداد {0} نفر بدلیل محدودیت پردازنده", cpuUsageExtraCount.ToString()));
                //    logger.Flush();
                //}
            }
            catch (Exception ex)
            {
                logger.Error("ExecuteByRobot", "Eception on ExecuteByRobot : " + Utility.GetExecptionMessage(ex), ex);
                logger.Flush();
            }
        }