Ir para conteúdo
rtavix

gerenciamento de threads, controle de dados

Recommended Posts

Estou com dúvidas de como fazer um controle de uma thread, eu tenho um sistema de importação, onde importo minhas planilhas para a base dados, porém utilizo threads pois possuo muitos registros, funciona! Porém eu gostaria de saber como eu faço para pegar o ultimo numero do processo judicial, e tipo todo processo judicial que terminar com o numero 0 eu pego e insiro somente os processos terminados com o numero 0, e todos terminados com 1 e 2 e assim por diante dentro da thread para ter uma controle?

 

Esse é meu método de importar:

 

protected void importar_Click(object sender, EventArgs e)
        {

            usuarioLogado = aplUsuario.buscaPorLogin(ObterUsuarioAutenticado().Login);
            log.Clear();
            //Stopwatch relogio = new Stopwatch();
            //relogio.Start();
            DataTable Dados = new DataTable();
            //Verifica se um arquivo foi selecionado
            if (selecionarArquivo.HasFile)
            {
                //Valida a extensão do arquivo:
                if (Path.GetExtension(selecionarArquivo.FileName) != ".xlsx" && Path.GetExtension(selecionarArquivo.FileName) != ".xls")
                    ClientScript.RegisterStartupScript(typeof(string), "Erro", "<script>alert('Somente arquivos em excel')</script>");
                else
                {
                    if (selecionarArquivo.FileContent != null)
                    {
                        string Excel = AppDomain.CurrentDomain.BaseDirectory + selecionarArquivo.FileName;
                        selecionarArquivo.SaveAs(Excel);
                        Dados = DadosExcel(Excel);

                        //Tentavia de ordenação através da coluna.
                        //System.Data.DataView view = Dados.DefaultView;

                        //view.Sort = "G ASC";


                        //Tentativa 2 de ordenação pegando pelos dados.
                        //string strSort = "NOME ASC";

                        //System.Data.DataView dtview = new System.Data.DataView(Dados);
                        //dtview.Sort = strSort;
                        //DataTable dtsorted = dtview.ToTable();

                        //Tentaiva 3
                        //Dados.DefaultView.Sort = "G Asc";
                        //string[] nomeInteressado = new string[Dados.Rows.Count];
                        //for (int i = 0; i < Dados.Rows.Count; i++)
                        //{
                        //    nomeInteressado[i] = Dados.Rows[i]["G"].ToString();
                        //}
                        //Array.Sort(nomeInteressado);

                        //for (int i = 1; i < Dados.Rows.Count; i++)
                        //{
                        //    Dados.Rows[i]["G"] = nomeInteressado[i];
                        //}

                        //Tentativa pela ordenação usando o IOrderedEnumerable, não funcionou.
                        //IOrderedEnumerable<DataRow> resultado;
                        //resultado = Dados.Select().OrderBy(d => d["NOME"]);

                        //Tentativa invalida
                        //Dados.DefaultView.Sort = "A Asc";
                        //var dataparam = Dados.AsEnumerable().OrderBy(linha => linha.Field<int>("indice"));
                        //Dados.Columns.Add("NUMERO JUDICIAL", typeof(string));
                        //Dados.Rows.Add(16, "0022350-77.2016.8.08.0048");
                        //Dados.Rows.Add(76, "0021704-78.2016.8.08.0012");
                        //Dados.Rows.Add(13, "0009360-20.2017.8.08.0048");
                        //Dados.Rows.Add(14, "0017555-91.2017.8.08.0048");
                        //Dados.Rows.Add(73, "0031279-52.2012.8.08.0012");
                        //Dados.Rows.Add(15, "0017734-93.2015.8.08.0048");
                        //Dados.Rows.Add(111, "0015570-97.2015.8.08.0035");


                        //var dataparam = Dados.AsEnumerable().OrderBy(linha => linha.Field<int>("indice"));

                        //foreach (var item in dataparam)
                        //{
                        //    string text = "";
                        //    foreach (var clm in item.ItemArray)
                        //        text += string.Format("{0}\t " + " _ ", clm);
                        //    Response.Write(text + "<br/>");

                        //}
                        
                        Dados.Columns.Add("indice", typeof(int));

                        int i = 1;
                        foreach (DataRow linha in Dados.Rows)
                        {
                           linha["indice"] = i;
                            i++; 
                        }

                        var registrosValidos = ((DataTable)Dados).Rows.OfType<DataRow>().Skip(5);
                        //Elimina a última linha
                        registrosValidos = registrosValidos.Take(registrosValidos.Count() - 1);
                        //ler de 100 em 100 regisros
                        int quantidade_por_pagina = 100;
                        int total_de_paginas;
                        //Conta os registros válidos
                        int qtd_total_registros = registrosValidos.Count();
                        //Realiza o calculo matemáticos para total de paginas.
                        total_de_paginas = (int)Math.Ceiling((double)qtd_total_registros / quantidade_por_pagina);
                        if (registrosValidos.Count() > 0)
                        {
                            bool layoutValido = VerificaLayout(Dados);

                            if (!layoutValido)
                                ClientScript.RegisterStartupScript(typeof(string), "Erro", "<script>alert('Layout do arquivo fora do padrão definido para importação.')</script>");

                            else
                            {
                                //Validação básica necessária para importação. PS: NumLinhas-1 porque o arquivo tem a última linha com total, que é inútil à importação.
                                VerificacaoPreliminar(registrosValidos);

                                //Inicio da rotina de repetição para leitura de todas as linhas, iniciando na célula B6
                                if (!arquivoInvalidado)
                                {
                                    this.ValidaDuplicidadeInteressado();
                                    //Criando as tarefas paralelas
                                    List<System.Threading.Tasks.Task> TarefasParalelas = new List<System.Threading.Tasks.Task>();
                                    for (int j = 0; j < total_de_paginas; j++)
                                    {

                                        var pagina = j;
                                        //leio as 100 linhas
                                        var linhasPorPagina = registrosValidos.Skip(pagina * quantidade_por_pagina).Take(quantidade_por_pagina);

                                        //Quebrando em 10 threads, vou quebrar a lista com a extenção criada abaixo
                                        var data_rows_divididos = linhasPorPagina.SplitList(10);

                                        foreach (var linhasDivididas in data_rows_divididos)
                                        {
                                            //ADICIONO A MINHA LISTA DE TAREFAS PARALELAS
                                            TarefasParalelas.Add(ProcessamentoTabela(linhasDivididas, j, usuarioLogado));
                                        }
                                    }

                                    //INICIOS AS TAREFAS PARALELAS
                                    foreach (var tarefa in TarefasParalelas)
                                        tarefa.Start();

                                    // AGORA ESPERO TODAS TAREFAS CONCLUIREM
                                    System.Threading.Tasks.Task.WaitAll(TarefasParalelas.ToArray());

                                    // ClientScript.RegisterStartupScript(Page.GetType(), "Carregando...", "<script>document.getElementById('progresso').style.width = '60%';</script>");
                                }
                                if (listaGravarProcInter.Count != 0)
                                {
                                    foreach (ProcessoInteressado item in listaGravarProcInter)
                                    {
                                        aplProcessoInteressado.salvar(item);
                                    }
                                }

                                if (listaLogsAuditoria.Count != 0)
                                {
                                    foreach (var item in listaLogsAuditoria)
                                    {
                                        aplLog.LogarAtividade(usuarioLogado, item, DateTime.Now);
                                        //aplLog.LogarAtividade(aplUsuario.buscaPorLogin(ObterUsuarioAutenticado().Login), item, DateTime.Now);
                                    }
                                }
                                else
                                {
                                    logimportacao.Visible = true;
                                    loglbl.Text = log.ToString();
                                    ClientScript.RegisterStartupScript(typeof(string), "Erro", "<script>alert('Arquivo não importado. Verifique o log de erros na tela. ')</script>");
                                }

                            }
                        }
                    }
                }
            }

            //Tempo de importação.
            //relogio.Stop();
            //Debug.WriteLine("#############" + relogio.Elapsed.ToString());
        }

 

E aqui é meu método da Thread:

 

private System.Threading.Tasks.Task ProcessamentoTabela(IEnumerable<DataRow> dadosparam, int i, Usuario usuarioLogado)
        {
            //usuarioLogado = aplUsuario.buscaPorLogin(ObterUsuarioAutenticado().Login);
            i = 4;
            i++;
            
            Action<object> processamento = (dados) =>
            {
                /*if (NHibernate.Context.ThreadStaticSessionContext.HasBind(NhibernateHelper.SessionFactory.))*/
                NHibernate.Context.ThreadStaticSessionContext.Bind(NhibernateHelper.HelpThreading().OpenSession());
                //Tentativa de ordenação por linha dentro do foreach direto no método da thread.
                //foreach (var linha in ((IEnumerable<DataRow>)dados).OrderBy(linha => linha["indice"]))
                foreach (var linha in (IEnumerable<DataRow>)dados)
                {
                    
                    List<Processo> listaProcessoExistente = new List<Processo>();
                    Processo processo = null;
                    Interessado interessado = new Interessado();

                    //busca o processo pelo nº judicial anterior ou atual
                    if (!linha.ItemArray[1].ToString().Equals(""))
                        processo = aplProcesso.consultar---ProcessoER(linha.ItemArray[1].ToString());
                    if (processo == null)
                    {
                        if (!linha.ItemArray[2].ToString().Equals(""))
                            processo = aplProcesso.consultar---ProcessoER(linha.ItemArray[2].ToString());
                    }

                    //busca o interessado por cpf/cnpj
                    if (linha.ItemArray[7].ToString().Length == 14)
                        interessado = aplInteressado.ConsultarPorCPF(AuxiliarCPF_CNPJ.DesformataCPF(linha.ItemArray[7].ToString()));

                    if (linha.ItemArray[7].ToString().Length == 18)
                        interessado = aplInteressado.ConsultarPorCPF(AuxiliarCPF_CNPJ.DesformataCNPJ(linha.ItemArray[7].ToString()));

                    if (processo != null)
                    {
                        
                        //se o processo não for nulo busco todos procinter relacionados a ele
                        List<ProcessoInteressado> listaprocinter = aplProcessoInteressado.consultarPorIdProcesso(processo.Codigo);
                        if (listaprocinter.Exists(o => o.Interessado == interessado))
                            log.Append("O interessado informado na linha " + (linha["indice"]) + " foi adicionado novamente ao processo " + processo.NumProcessoJudicial + " <br>");
                        //log.Append("O interessado " + processo.Interessado.Nome + " foi adicionado novamente ao processo " + processo.NumProcessoJudicial + " <br>");
                        // log.Append("O interessado " + processo.Interessado.Nome + " foi adicionado novamente ao processo " + processo.NumProcessoJudicial + " <br>");
                        setProcInter(processo, interessado, linha, i);
                    }

                    else
                    {
                        //Novo Processo - 6.3
                        processo = new Processo();
                        processo.Interessado = interessado;
                        processo.NumProcessoJudicial = linha.ItemArray[2].ToString().Trim();
                        processo.RenunciaCredito = "N";
                        processo.Situacao = new AplSituacao().ConsultarPorId(1);
                        processo.HonorarioDativo = "S";
                        processo.Reclamado = new AplReclamado().buscaItem(2);
                        processo.TipoDocumento = new AplTipoDocumento().buscaItem(4);
                        processo.TipoProcesso = "O";
                        if (linha.ItemArray[5].ToString().Contains("juizado"))
                            processo.Tribunal = new AplTribunal().buscaItem(71);
                        else
                            processo.Tribunal = new AplTribunal().buscaItem(3);
                        processo.NaturezaDespeza = new AplNaturezadeDespesa().buscaItem(3);

                        VaraExecucao vara = new VaraExecucao();
                        if (!linha.ItemArray[3].ToString().Equals("") && !linha.ItemArray[5].ToString().Equals(""))
                        {
                            List<VaraExecucao> listaVaraComarca = aplVaraExecucao.Consultar---omeVaraNomeComarca(linha.ItemArray[5].ToString().Trim(), linha.ItemArray[3].ToString().Trim());
                            if (listaVaraComarca.Count != 0)
                            {
                                if (linha.ItemArray[4].ToString().Equals(""))
                                {
                                    vara = listaVaraComarca.Find(o => o.NumeroVara == null);
                                }
                                else
                                {
                                    vara = listaVaraComarca.Find(o => o.NumeroVara == int.Parse(linha.ItemArray[4].ToString().Trim()));
                                }
                            }
                        }
                        if (vara != null && vara.Codigo != 0)
                        {
                            processo.VaraExecucao = vara;
                        }
                        aplProcesso.gravar(processo);
                        //aplLog.LogarAtividade(aplUsuario.buscaPorLogin(ObterUsuarioAutenticado().Login), "Importação do processo de número judicial: " + processo.NumProcessoJudicial
                        aplLog.LogarAtividade(usuarioLogado, "Importação do processo de número judicial: " + processo.NumProcessoJudicial
                                                + ". Interessado: " + processo.Interessado.Nome + " - " + processo.Interessado.CPF_CNPJ + ". Tribunal "
                                                + processo.Tribunal.NomeTribunal + ".", DateTime.Now);
                        //log.Append("O processo " + processo.NumProcessoJudicial + " informado na linha " + (i + 1) + " foi cadastrado com sucesso. <br>");

                        setProcInter(processo, interessado, linha, i);
                    }

                }//Fim Foreach

                //ClientScript.RegisterStartupScript(Page.GetType(), "Carregando...", "<script>document.getElementById('progresso').style.width = '60%';</script>");

                logimportacao.Visible = true;
                loglbl.Text = log.ToString();
                //ClientScript.RegisterStartupScript(Page.GetType(), "Carregando...", "<script>document.getElementById('progresso').style.width = '100%';</script>");
                ClientScript.RegisterStartupScript(typeof(string), "Alerta", "<script>alert('Arquivo importado com sucesso. Verifique o log na tela. ')</script>");
                
            };


            ISession sessao = ThreadStaticSessionContext.Unbind(NhibernateHelper.HelpThreading());
            if (sessao != null)
            {
                if (sessao.Transaction != null && sessao.Transaction.IsActive)
                {
                    sessao.Transaction.Rollback();
                }
                else
                {
                    sessao.Flush();
                }
                sessao.Close();

            }
            //Tarefas baseadas de forma assíncrona
            System.Threading.Tasks.Task tarefa_executar = new System.Threading.Tasks.Task(processamento, dadosparam);

            return tarefa_executar;
        }

Como eu poderia ter esse controle?

 

Coluna C é aonde está meus processos judicial, no meu sistema indice 0 é igual a coluna 1, indice 1 é igual a coluna 2, indice 2 é igual a coluna 3(local do processo). Como poderia esta controlando isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Jonathacsantos
      Boa tarde, sou novo na programação, comecei por conta própria e agora estou com um pequeno problema, meu programa depende de uma pasta criada pra executar um .exe que fica dentro de uma outra pasta, sendo que eu preciso que ele leia o .exe independente de onde ele fica instalado, vou mostrar uma parte do código para tentar explicar 
      private void AcessRemo_Click(object sender, EventArgs e) { foreach ( var process in Process.GetProcessesByName("TeamViewer")) { process.Kill(); } Process.Start("C:\\Teste\\suporteremoto.exe"); ele fecha um teamviewer em execução e executa uma versão especifica do teamviewer, sendo que nos meus testes funciona pq eu tenho essa pasta ai chamada teste, mas o programa instala em Program Files, sendo que se for 64, ele vai pra Program Files (x86), dai gostaria de fazer ele ler, tipo um [LocalPath] , mas não sei como , se alguem puder me ajudar ou me da uma luz eu agradeço muito.
    • Por lucasrodrigues
      Estou com esse problema ao tentar vincular uma tabela do MySql a um DataSet. Utilizo o MySqlConnector 8.0.13, MySql-For-VisualStudio 1.2.8.

    • Por jtc-carr
      Linguagem c
      Queria a partir de um ficheiro fazer varias somas do seu conteúdo por exemplo de caracteres especiais, vogais, letra "a" , números, De forma a que devolve-se por exemplo 5 linhas, 4 caracteres especiais, 7 vogais, 9 "a", 6 numeros, num total de 40 caracteres, para os numeros fiz um if, para a função mas não funciona como devia
      while( (texto[MAX]=fgetc(textos))!= EOF ) if(texto[MAX] == '\n') linha++; printf("Existem %d linhas no arquivo\n", linha); if (i == '0' || i == '1' || i == 2' || i == '3' || i == '4' || i == '5' || i == 6' || i == '7' || i == '8'|| i == '9' ) Ajuda seria bem vinda, que queria perceber bem isto
    • Por Maicon Santos
      Foi me passada a tarefa de fazer um sistema onde o usuário (funcionário 1) (Funcionário da empresa X) irá fazer um cadastro com suas informações, após esse cadastro essas informações serão avaliadas por outro funcionário (funcionário 2) da empresa X que fica responsável apenas por verificar as informações desse usuário e dar permissões a ele. Até então é um sistema simples de cadastro.
      Após o funcionário 1 fazer o cadastro o funcionário 2 avaliará essas informações para ver se esse usuário pode ter acesso a conta bancária da empresa. (Pera! Como assim?) Exatamente isso, o usuário vai se cadastrar e se ele for apto a acessar a conta bancária da empresa o sistema terá que fazer o login na conta bancária da empresa, ou seja o sistema deve apenas verificar os dados do funcionário 1, se ele for apto abrir a conta da empresa o sistema terá que passar os dados pelo internet banking do Santander.
       
      Um outro exemplo que talvez facilite entender:
      Os funcionários 1, 2 e 3 trabalham juntos gerenciando as finanças da empresa, então todos eles precisam acessar a conta bancaria da empresa, mas o gerente para não ter que passar o login e senha para eles quer que o sistema faça esse login, sem que os funcionários saibam esses devidos dados, então os funcionários farão um cadastro no sistema e após fazer o login no mesmo eles automaticamente fazem o login na conta do Santander da empresa
       
      Basicamente isso, minhas dúvidas até o momento:
      Isso é realmente possível? Fazer o login no internet banking, que tem a função de ser muito seguro, através de um outro sistema
      Eu tenho a disponibilidade para escolher entre fazer um sistema desktop (usando C#, que eu tenho mais domínio) ou fazer um sistema WEB (que eu não possuo tanto domínio assim das linguagens), para fazer esse tipo de trabalho, o que seria mais indicado?
      Quais dicas vocês podem me dar para essa tarefa? Eu trabalho na área de desenvolvimento a pouco tempo, por isso não tenho muito conhecimento de sistemas desse nível, qualquer direção será de grande ajuda.
      Grato!
    • Por Master_Cyber
      Bom noite pessoal... Estou fazendo um bot que se comunica com o QnaMaker, e dependendo da resposta, deverá ser aberto uma conversação guiada através do FormFlow com uso  do Json.
      Meu problema é exatamente neste ponto para conseguir abrir o formulário.
      Estou usando a SDK V3 e o QnAMakerDialog do garypretty.
      Resumidamente neste ponto devo fazer algo para iniciar o form.
      public override async Task DefaultMatchHandler(IDialogContext context, string originalQueryText, QnAMakerResult result) {     QnaAnswer a = result.Answers.First();     var messageActivity = ProcessResultAndCreateMessageActivity(context, ref result);          if (a.Answer == "form")     {         // ABRIR FORM AQUI     }          await context.PostAsync(messageActivity);     context.Wait(MessageReceived); }  
      Já tentei várias coisas como chamar context.Forward ou context.Call, mas não da certo,  talvez eu esteja chamando de forma errada.
      Sempre retorna a mensagem dizendo que existe um problema no código fonte.
      Vocês podem me ajudar?
      Obrigado!!
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.