Boa tarde pessoal gostaria de uma opinião de vocês sobre thread e BackgroundWorker. Meu problema é o seguinte estou em um projeto na fase de importação de dados, os arquivos de importação giram em torno de 20 a 30 mil linhas. que leva cerca de 10 a 15 minutos para serem processados nesse tempo a tela (aplicação web) fica em branco. 

A importação é dividida em métodos:

public bool GerarHeader()
public bool GerarResumo()
public bool GerarAssinatura()
public bool GerarUtilizacao()
public bool GerarTrailler()

Os métodos ficam em um arquivo .cs, e chamo eles na minha página e após a execução de um método retornar true eu chamo o próximo método, meu problema que as mensagem só aparecem após todos os métodos serem executados gostaria de mostrar as mensagem após a execução de cada método. Pelo que eu li pode ser possível usando thread ou backgroudWorker mas não consegui entender os artigos que eu achei, se alguém tiver algo de fácil entendimento, agradeço desde já.

Exibições: 472

Respostas a este tópico

System.Threading.Tasks.Task.WaitAll(new Task[]{()=>GerarHeader(), ()=>GerarResumo(),()=>GerarAssinatura()=>GerarUtilizacao(), ()=>GerarTrailler()});

Isso vai fazer com que todos os métodos sejam executados ao mesmo tempo. Se você quer que o usuário veja alguma coisa na tela enquanto os metodos são executados, retorna a pagina, e, por ajax, chame outra pagina que executa esses metodos

Eu começaria desta forma.

1 - Criaria uma string mensagem.

2 - Configuraria a thread para atualizar esta string conforme ela for correndo.

3 - Pagina teria um label que exibiria a mensagem

4 - colocaria um timer com x segundos que atualizaria esse label com a mensagem atual.

A ideia é esta.

Olá Clayton, Vinicius boa tarde então eu estou fazendo da seguinte maneira você poderia me indicar como invocar a e mostrar isso estou fazendo dessa maneira no arquivo .cs do aspx

ImportarExcel importar = new ImportarExcel();
string path = Server.MapPath("~\\Files\\Import_Files\\FILE062013_2109784427.XLS");
if (importar.GerarHeader(path))
{
   lbProcessamento.Text = "Informação básica gerada com sucesso.<br />";
   if (importar.GerarResumo(path))
   {
      lbProcessamento.Text += "Números dos contratos gerados com sucesso.<br />";
      if (importar.GerarAssinatura(path))
      {
         lbProcessamento.Text += "Assinatura de serviços gerados com sucesso.<br />";
         if (importar.GerarUtilizacao(path))
         {
            lbProcessamento.Text += "Dados de utilização gerados com sucesso.<br />";
            if (importar.GerarTrailler(path))
            {
               lbProcessamento.Text += "Trailler gerado com sucesso.<br />";
            }
            else
            {
               lbProcessamento.Text += "Falha na geração do trailler.<br />";
            }
         }
         else
         {
            lbProcessamento.Text += "Falha na importação das informações de utilização.<br />";
         }
      }
      else
      {
         lbProcessamento.Text += "Falha na geração das assinaturas contratadas.<br />";
      }
   }
   else
   {
      lbProcessamento.Text += "Falha na geração dos números dos contratos.<br />";
   }
}
else
{
   lbProcessamento.Text = "Falha na geração das informacões básicas.<br />";
}

Galera, posso estar errado.

Mas a thread consegue interagir com elementos de tela?

Ja havia feito um experimento deste tipo e não consegui mudar nada na tela usando thread .

Me corrijam se eu estiver errado.

abrs a todos

Marcio:

Por isto entra o timer, ele irá verificar esta variável que será alterada pela thread e ele exibirá ela na tela.

Este lbProcessamento.Text é sua variavel string né?

No começo do métodos você coloca.

"Iniciando analise X"

No final você coloca.

Terminado analise X com sucesso.

Se falhar.

Falha no processamento da analise X.

Agora você cria um timer que lê a string e atualiza os campos.

Então Clayton ele é um label que uso para mostrar na tela. Eu achei um exemplo que fica proximo ao que eu quero mas não consegui adaptar para a minha realidade será que posso postar o exemplo aqui?

Clayton Novaes disse:

Marcio:

Por isto entra o timer, ele irá verificar esta variável que será alterada pela thread e ele exibirá ela na tela.

Este lbProcessamento.Text é sua variavel string né?

No começo do métodos você coloca.

"Iniciando analise X"

No final você coloca.

Terminado analise X com sucesso.

Se falhar.

Falha no processamento da analise X.

Agora você cria um timer que lê a string e atualiza os campos.

Poste, mas eu ando atarefado. Se der tempo do uma olhadinha.

Opa fique tranquilo estou tentando pesquisar e achar. Esse arquivo ele faz algo parecido como estou pensando mas não posso usar o global.asax por que tenho vários processos de importação então teria que chamar automaticamente quando carrega a pagina do processo, mostrando os status na tela.

Clayton Novaes disse:

Poste, mas eu ando atarefado. Se der tempo do uma olhadinha.

Anexos

Olhei só o texto da pessoa que escreveu.

Este é o processo correto mesmo. É aquilo que expliquei.

Ele usa o global para criar a thread em modo de aplicação, pois se criar no aspx ele será encerrado toda vez que ele terminar de carregar.

Ele funciona assim por que em um website se você manter as páginas trabalhando em memória com muitos acesso. Você mataria o servidor.

Por isto ele inicia, processa e finaliza todas páginas aspx.

RSS

© 2020   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço