gerenciamento de threads, controle de dados
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?Discussão (1)
Carregando comentários...