public string ProcessTask(List <Loanbook_Data> loanbook, List <LifetimeEad> lifetimeEad, List <LifetimeLgd> lifetimeLGD, List <IrFactor> cummulativeDiscountFactor, List <LifeTimeProjections> eadInput, List <StageClassification> stageClassifcation, bool overrideExist)
        {
            var lifetimePds = new ScenarioEclWorkings(this._eclId, this._Scenario, this._eclType).Get_LifetimePd_And_RedefaultLifetimePD_Result();

            //var stageClassifcation = stageClassifcation;// GetStageClassification(loanbook);

            var threads = loanbook.Count / 500;

            threads = threads + 1;

            var taskLst = new List <Task>();

            //threads = 1;
            for (int i = 0; i < threads; i++)
            {
                var sub_LoanBook = loanbook.Skip(i * 500).Take(500).ToList();
                var contractNo   = sub_LoanBook.Select(o => o.ContractId).ToList();

                var task = Task.Run(() =>
                {
                    RunFrameWorkJob(lifetimeEad, lifetimeLGD, cummulativeDiscountFactor, eadInput, lifetimePds, stageClassifcation, overrideExist, contractNo);
                });
                taskLst.Add(task);
            }
            Log4Net.Log.Info($"Total Task : {taskLst.Count()}");

            var completedTask = taskLst.Where(o => o.IsCompleted).Count();

            Log4Net.Log.Info($"Task Completed: {completedTask}");

            //while (!taskLst.Any(o => o.IsCompleted))
            var tskStatusLst = new List <TaskStatus> {
                TaskStatus.RanToCompletion, TaskStatus.Faulted
            };

            while (0 < 1)
            {
                if (taskLst.All(o => tskStatusLst.Contains(o.Status)))
                {
                    break;
                }
                //Do Nothing
            }


            return("");
        }
        private void RunFrameWorkJob(List <LifetimeEad> lifetimeEad, List <LifetimeLgd> lifetimeLGD, List <IrFactor> cummulativeDiscountFactor, List <LifeTimeProjections> eadInput, List <LifeTimeObject> lifetimePds, List <StageClassification> stageClassification, bool overrideExist, List <string> contractNo)
        {
            var sub_stageClassification = stageClassification.Where(o => contractNo.Contains(o.ContractId)).ToList();
            var sub_lifetimeEad         = lifetimeEad.Where(o => contractNo.Contains(o.ContractId)).ToList();
            var sub_lifetimeLGD         = lifetimeLGD.Where(o => contractNo.Contains(o.ContractId)).ToList();
            var sub_eadInput            = eadInput.Where(o => contractNo.Contains(o.Contract_no)).ToList();

            var obj = new ScenarioEclWorkings(this._eclId, this._Scenario, this._eclType);

            var d = obj.ComputeFinalEcl(sub_lifetimeEad, sub_lifetimeLGD, sub_eadInput, cummulativeDiscountFactor, lifetimePds, sub_stageClassification);

            var _scenerio = 0;

            if (this._Scenario == ECL_Scenario.Best)
            {
                _scenerio = 1;
            }
            if (this._Scenario == ECL_Scenario.Optimistic)
            {
                _scenerio = 2;
            }
            if (this._Scenario == ECL_Scenario.Downturn)
            {
                _scenerio = 3;
            }

            foreach (var _d in d)
            {
                _d.eCL_Scenario = _scenerio;
            }
            if (overrideExist)
            {
                var r = Util.FileSystemStorage <FinalEcl> .WriteCsvData(this._eclId, ECLStringConstants.i.FrameworkResultOverride(this._eclType), d);

                //Save to Framwork Override table
                Log4Net.Log.Info($"Inserting into override table {d.Count}");
            }
            else
            {
                var r = Util.FileSystemStorage <FinalEcl> .WriteCsvData(this._eclId, ECLStringConstants.i.FrameworkResult(this._eclType), d);

                //save to Framework table
                Log4Net.Log.Info($"Inserting into Non override table {d.Count}");
            }
        }