public void Adicionar(CandidatoViewModel obj)
        {
            var vaga = Mapper.Map <CandidatoViewModel, Candidato>(obj);

            _candidatoRepository.Adicionar(vaga);
        }
        /// <summary>
        /// gera imagens de respostas
        /// </summary>
        private void GerarImagens()
        {
            try {
                #region inicializa
                tarefas = new List <Task>();

                Stopwatch sw = new Stopwatch();
                sw.Start();

                int itens             = 0;
                SimuladorRepository s = new SimuladorRepository(new DatabaseFactory());
                s.LimparRespostasECandidatos();

                //sempre num único contexto
                int totalQuestoes = 0;
                using (var _db = new CorretorDeProvasDbContext())
                {
                    totalQuestoes = _db.Questao.Count();
                    _db.Database.Connection.Close();
                }
                //nao existem questoes cadastradas?
                if (0 == totalQuestoes)
                {
                    MessageBox.Show("Nenhuma questão foi encontrada.\n\nCrie algumas questões ou verifique se a configuração de banco de dados está correta e se o banco está acessível.\n\nPersistindo o problema entre em contato com [email protected]", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                //informa a barra de progresso de questoes ao valor máximo possível da barra
                totalQuestoes = TOTAL_CANDIDATOS * totalQuestoes;

                //if (totalQuestoes > 10000)
                //{
                //    formato = "N5";
                //}
                //else if (totalQuestoes > 3000)
                //{
                //    formato = "N4";
                //}
                //else if (totalQuestoes > 300)
                //{
                //    formato = "N3";
                //}
                #endregion


                #region threads
                //a barra de progresso é todo o universo de usuarios x numero de questoes
                Invoke(new Action(() => { progressBar1.Maximum = totalQuestoes; btnGerar.Text = "Aguarde..."; }));

                //gera resposta
                //System.Diagnostics.Trace.WriteLine($"Decorrido {sw.Elapsed.Hours}:{sw.Elapsed.Minutes}:{sw.Elapsed.Seconds}:{sw.Elapsed.Milliseconds}");
                //List<Task> tarefas = new List<Task>();
                ParallelLoopResult resultado = Parallel.For(0, TOTAL_CANDIDATOS, opcaoParalelismo, i =>
                {
                    tarefas.Add(Task.Run(() => {
                        //geramos uma populacao de candidatos com cpfs unicos
                        Candidato candidato = new Candidato {
                            CandidatoCPF = Util.GerarCPF(i), CandidatoNome = Util.GerarNomeCandidato()
                        };

                        #region adicionamos uma nova thread
                        //novo contexto
                        using (var _db2 = new CorretorDeProvasDbContext())
                        {
                            //adiciona um candidato
                            var _candidatoRepository = new CandidatoRepository(_db2);

                            _candidatoRepository.Adicionar(candidato);
                            candidato = _candidatoRepository.Procurar(candidato.CandidatoID);

                            foreach (Questao questao in _db2.Questao.ToList())
                            {
                                //algum usuario do grupo elaboradores
                                Usuario elaborador = _db2.Usuario.ToList().FirstOrDefault(u => u.GrupoID == 1);

                                Task.Run(async() =>
                                {
                                    //adiciona uma resposta da questao para candidato com a imagem
                                    var resposta = MontarResposta(elaborador, questao, candidato, Imagem.GerarFolha(questao.QuestaoNumero.ToString(), candidato.CandidatoNome));
                                    //evitamos problema de dbcontext que não é thread safe fazendo chamadas diretas ao banco de dados
                                    await s.CriarResposta(resposta);

                                    //imprime progresso
                                    Invoke(new Action(() =>
                                    {
                                        progressBar1.Value = itens;
                                        //System.Diagnostics.Trace.WriteLine($"Progresso {progresso}% - Decorrido {sw.Elapsed.Hours}:{sw.Elapsed.Minutes}:{sw.Elapsed.Seconds}:{sw.Elapsed.Milliseconds}");
                                    }));
                                });
                                Interlocked.Increment(ref itens);
                            }
                            _db2.Dispose();
                        }
                        #endregion

                        Invoke(new Action(() => {
                            progressBar1.Value = itens;
                            string progresso   = (itens * 100.00 / totalQuestoes).ToString(formato);
                            lblProgresso.Text  = $"Progresso {progresso}%";
                        }));
                    }));
                });//for prepara tarefas

                //quando todas as tarefas terminarem atualizamos a interface
                Task.WhenAll(tarefas.Where(x => x != null).ToArray()).ContinueWith(t =>
                {
                    /*todas as tarefas foram concluidas*/
                    Invoke(new Action(() =>
                    {
                        System.Diagnostics.Trace.WriteLine($"Tempo decorrido {sw.Elapsed.ToString(@"hh\:mm\:ss")}");
                        sw.Stop();
                        progressBar1.Value = itens;
                        string progresso   = (itens * 100.00 / totalQuestoes).ToString(formato);
                        lblProgresso.Text  = $"Progresso {progresso}%";
                        btnGerar.Enabled   = true; btnGerar.Text = "Gerar respostas";
                    }));
                });

                #endregion
            }
            catch (NullReferenceException) {
            }
            catch (Exception)
            {
            }
        }