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); } }
/// <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(); } }