public void PreparaCenario(List <Cenario> cenarios, ParametrosPerna[] parametrosPernas, ParametrosPernaCenario[] parametrosPernasCenario, int perna) { ParametrosPerna parametrosPerna = parametrosPernas[perna]; if (perna < parametrosPernas.Length - 1) { List <Task> tasks = new List <Task>(); List <List <Cenario> > cenariosPorTasks = new List <List <Cenario> >(); for (decimal x = parametrosPerna.MinX; x <= parametrosPerna.MaxX; x = decimal.Add(x, 0.01m)) { parametrosPernasCenario[perna].X = x; if (perna == 0) { ParametrosPernaCenario[] parametrosPernasNovoCenario = new ParametrosPernaCenario[parametrosPernas.Length]; for (int i = 0; i < parametrosPernas.Length; i++) { parametrosPernasNovoCenario[i] = new ParametrosPernaCenario(parametrosPernasCenario[i]); } /// Cada task tem uma lista de cenários, para evitar problemas de concorrência List <Cenario> cenariosPorTask = new List <Cenario>(); cenariosPorTasks.Add(cenariosPorTask); Task task = Task.Run(() => PreparaCenario(cenariosPorTask, parametrosPernas, parametrosPernasNovoCenario, perna + 1)); tasks.Add(task); } else { PreparaCenario(cenarios, parametrosPernas, parametrosPernasCenario, perna + 1); } } if (tasks.Count > 0) { Task.WaitAll(tasks.ToArray()); foreach (List <Cenario> cenariosPorTask in cenariosPorTasks) { cenarios.AddRange(cenariosPorTask); } } } else { Cenario cenario = new Cenario(parametrosPernasCenario); cenario = CalculaUltimaPernaCenario(parametrosPernas, cenario, perna); if (cenario != null) { cenario = CalculaCenario(cenario); cenarios.Add(cenario); } } }
public void PreparaCenarios(List <Cenario> cenarios, ParametrosPerna[] parametrosPernas) { ParametrosPernaCenario[] parametrosPernasCenario = new ParametrosPernaCenario[parametrosPernas.Length]; for (int i = 0; i < parametrosPernas.Length; i++) { parametrosPernasCenario[i] = new ParametrosPernaCenario(parametrosPernas[i]); } PreparaCenario(cenarios, parametrosPernas, parametrosPernasCenario, 0); }
public Cenario(ParametrosPernaCenario[] parametros) { if (parametros == null) { throw new ArgumentNullException(nameof(parametros)); } Parametros = new ParametrosPernaCenario[parametros.Length]; for (int i = 0; i < parametros.Length; i++) { Parametros[i] = new ParametrosPernaCenario(parametros[i]); } ; }
public ParametrosPernaCenario(ParametrosPernaCenario source) { X = source.X; PrecoExec = source.PrecoExec; Vega = source.Vega; }