private async void ProcessarGeracao()
        {
            bool ret = false;

            Cursor.Current = Cursors.WaitCursor;

            ProcessGeneticAlgorithm pga = new ProcessGeneticAlgorithm(parametersGA);

            //pga.OnGANewGeneration += OnGANewGeneration;
            pga.OnGANewBestFitness += OnGANewBestFitness;

            btnParar.Visible = true;

            this.btnParar.Click += new System.EventHandler(delegate(object sender, EventArgs e)
            {
                pga.StopProcess();
            });

            startTime = DateTime.Now;

            Timer timer = new Timer();

            timer.Interval = 100;
            timer.Tick    += new EventHandler(timer_Tick);

            await Task.Run(() =>
            {
                GerarListaDeQuestoes();

                ret = parametersGA.Questoes.Count >= parametersGA.QtdQuestoes;
            });

            txtQtdQuestoesDisponiveis.Text = parametersGA.Questoes.Count.ToString("#,##0", CultureInfo.CurrentCulture);

            if (!ret)
            {
                ShowAlerta("Não há questões disponíveis para atender a quantidade de questões solicitada para a avaliação!");
            }

            if (ret)
            {
                timer.Start();

                await Task.Run(() =>
                {
                    ret = pga.Execute();
                });

                timer.Stop();

                AtualizaTempoProcessamento();
            }

            btnParar.Visible = false;

            if (ret)
            {
                StringBuilder sb = new StringBuilder();

                sb.Append(@"{\rtf1\ansi");
                sb.Append(@"\ansicpg1252\deff0\deflang1033");
                sb.Append(@"{\fonttbl{\f0\fnil\fcharset0 Courier New;}}");
                sb.Append(@"{\colortbl;\red255\green0\blue0;\red0\green255\blue0;\red0\green0\blue255; }");

                sb.Append("Quantidade de gerações: ").Append(@"\b ").Append(pga.GenerationCount.ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ").Append(@" \line ");
                sb.Append("Tempo de Processamento (Segs.): ").Append(@"\b ").Append(pga.ElapTimeSeconds.ToString()).Append(@"\b0 ").Append(@" \line ");
                sb.Append("Tipo de Finalização: ").Append(@"\b ").Append(pga.ExitCondiction.ToString()).Append(@"\b0 ").Append(@" \line ");

                sb.Append("Fitness: ").Append(@"\b ").Append(pga.BestGenome.Fitness.ToString()).Append(@"\b0").Append(@" \line ");
                sb.Append("Geração: ").Append(@"\b ").Append(pga.BestGenome.Generation.ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ").Append(@" \line ");

                //sb.Append("Hashcode: ").Append(pga.BestGenome.GetHashCode().ToString()).Append(@" \line ");

                sb.Append("Quantidade de Questões: ").Append(@"\b ").Append(pga.BestGenome.QtdTotal().ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ");
                if (pga.BestGenome.QtdTotal() != parametersGA.QtdQuestoes)
                {
                    sb.Append(@"\b ").Append(@"\cf1 ").Append(" <= Incorreto (Solicitado ").Append(parametersGA.QtdQuestoes.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 ").Append(@"\cf0");
                    ret = false;
                }
                sb.Append(@" \line ");

                sb.Append("Status:\t").Append(@"\b ");
                if (ret)
                {
                    sb.Append(@"\b ").Append("Gravação da Avaliação Permitida").Append(@"\b0 ").Append(@" \line ");
                }
                else
                {
                    sb.Append(@"\b ").Append(@"\cf1").Append("Impossível Gravar Avaliação").Append(@"\b0 ").Append(@"\cf0").Append(@" \line ");
                }

                sb.Append("Tempo Total das Questões: ").Append(@"\b ").Append(pga.BestGenome.TempoTotal().ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ");
                if (parametersGA.TempoPrevistoAvaliacao != 0 && pga.BestGenome.TempoTotal() != parametersGA.TempoPrevistoAvaliacao)
                {
                    sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(parametersGA.TempoPrevistoAvaliacao.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 ");
                }
                sb.Append(@" \line ");

                sb.Append(@" \line ");

                List <ConfigTipoQuestao> tipoQuestaoRules = new List <ConfigTipoQuestao>(parametersGA.TipoQuestaoRules);
                ConfigTipoQuestao        cqr;

                sb.Append("Quantidades por Tipo:").Append(@" \line ");

                sb.Append("\t").Append(TipoDeQuestao.Discursiva.ToString()).Append(":\t\t").Append(@"\b ").Append(pga.BestGenome.TipoTotal((int)TipoDeQuestao.Discursiva, (int)TipoDeQuestao.Discursiva).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ");
                cqr = tipoQuestaoRules.Find(x => x.TipoQuestao == TipoDeQuestao.Discursiva);
                if (cqr != null && pga.BestGenome.TipoTotal((int)TipoDeQuestao.Discursiva, (int)TipoDeQuestao.Discursiva) != cqr.Quantidade)
                {
                    sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(cqr.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 ");
                }
                sb.Append(@" \line ");

                sb.Append("\t").Append(TipoDeQuestao.EscolhaSimples.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.TipoTotal((int)TipoDeQuestao.EscolhaSimples, (int)TipoDeQuestao.EscolhaSimples).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ");
                cqr = tipoQuestaoRules.Find(x => x.TipoQuestao == TipoDeQuestao.EscolhaSimples);
                if (cqr != null && pga.BestGenome.TipoTotal((int)TipoDeQuestao.EscolhaSimples, (int)TipoDeQuestao.EscolhaSimples) != cqr.Quantidade)
                {
                    sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(cqr.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 ");
                }
                sb.Append(@" \line ");

                sb.Append("\t").Append(TipoDeQuestao.MultiplaEscolha.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.TipoTotal((int)TipoDeQuestao.MultiplaEscolha, (int)TipoDeQuestao.MultiplaEscolha).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ");
                cqr = tipoQuestaoRules.Find(x => x.TipoQuestao == TipoDeQuestao.MultiplaEscolha);
                if (cqr != null && pga.BestGenome.TipoTotal((int)TipoDeQuestao.MultiplaEscolha, (int)TipoDeQuestao.MultiplaEscolha) != cqr.Quantidade)
                {
                    sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(cqr.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 ");
                }
                sb.Append(@" \line ");

                sb.Append("\t").Append(TipoDeQuestao.ListaDeAssociacao.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.TipoTotal((int)TipoDeQuestao.ListaDeAssociacao, (int)TipoDeQuestao.ListaDeAssociacao).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ");
                cqr = tipoQuestaoRules.Find(x => x.TipoQuestao == TipoDeQuestao.ListaDeAssociacao);
                if (cqr != null && pga.BestGenome.TipoTotal((int)TipoDeQuestao.ListaDeAssociacao, (int)TipoDeQuestao.ListaDeAssociacao) != cqr.Quantidade)
                {
                    sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(cqr.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 ");
                }
                sb.Append(@" \line ");

                sb.Append(@" \line ");

                if (parametersGA.ComplexRules.Length > 0)
                {
                    sb.Append("Quantidades por regra de Complexidade:").Append(@" \line ");
                    foreach (ConfigComplexidade c in parametersGA.ComplexRules)
                    {
                        sb.Append("\tComplexidade ").Append(c.ComplexIni.ToString()).Append(" a ").Append(c.ComplexFim.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.ComplexTotal(c.ComplexIni, c.ComplexFim).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ");

                        if (pga.BestGenome.ComplexTotal(c.ComplexIni, c.ComplexFim) != c.Quantidade)
                        {
                            sb.Append(@"\b ").Append(" <= Incorreto (Solicitado ").Append(c.Quantidade.ToString("#,##0", CultureInfo.CurrentCulture)).Append(")").Append(@"\b0 ");
                        }

                        sb.Append(@" \line ");
                    }
                    sb.Append(@" \line ");
                }

                sb.Append("Quantidades por Complexidade:").Append(@" \line ");
                for (int i = 1; i <= 10; i++)
                {
                    sb.Append("\tComplexidade ").Append(i.ToString()).Append(":\t").Append(@"\b ").Append(pga.BestGenome.ComplexTotal(i, i).ToString("#,##0", CultureInfo.CurrentCulture)).Append(@"\b0 ").Append(@" \line ");
                }

                sb.Append(@" \line ");

                sb.Append("IDs das Questões:").Append(@" \line ");
                sb.Append(pga.BestGenome.ToString().Replace("|", ", ")).Append(@" \line ");

                sb.Append(" }");

                rtxResultado.Rtf = sb.ToString();
            }
            else
            {
                rtxResultado.Text = "Houve erro na geração da Avaliação.";
            }


            if (pga.BestGenome != null)
            {
                questoes = new List <int>(pga.BestGenome.IdsQuestoes());
            }
            else
            {
                questoes = new List <int>();
            }

            btnFechar.Enabled = true;
            btnGravar.Enabled = ret;

            Cursor.Current = Cursors.Default;
        }