Qual é a melhor maneira de lidar com processos de longa execução em um aplicativo ASP.Net?

StackOverflow https://stackoverflow.com/questions/73039

  •  09-06-2019
  •  | 
  •  

Pergunta

Na minha aplicação web existe um processo que consulta dados de toda a web, os filtra e os salva no banco de dados.Como você pode imaginar, esse processo leva algum tempo.Minha solução atual é aumentar o tempo limite da página e fornecer uma barra de progresso AJAX ao usuário enquanto ela carrega.Isso é um problema por dois motivos - 1) ainda demora muito e o usuário deve esperar 2) às vezes ainda expira.

Eu me envolvi em encadear o processo e li que deveria publicá-lo de forma assíncrona em um serviço da web ("Disparar e esquecer").

Algumas referências que li:
- MSDN
- Dispare e esqueça

Então minha pergunta é: qual é o melhor método?

ATUALIZAR:Depois que o usuário inserir seus dados, gostaria de redirecioná-los para a página de resultados que é atualizada gradativamente à medida que o processo é executado em segundo plano.

Foi útil?

Solução

Para evitar o excesso de astronomia arquitetônica, muitas vezes use um iframe oculto para chamar o processo de longa execução e transmitir informações de progresso.Juntamente com algo como jsProgressBarHandler, você pode facilmente criar uma excelente indicação de progresso fora de banda para tarefas mais longas, onde uma animação genérica de progresso não é suficiente.

Na sua situação específica, você pode querer usar uma chamada LongRunningProcess.aspx por tarefa, para evitar o tempo limite da página.

Por exemplo, chame LongRunningProcess.aspx?taskID=1 para iniciá-la e, no final da tarefa, emita um

document.location = "LongRunningProcess.aspx?taskID=2".  

Até náusea.

Outras dicas

Tivemos um problema semelhante e resolvemos iniciando o trabalho por meio de uma chamada de serviço web assíncrona (o que significava que o usuário não precisava esperar o trabalho terminar).O serviço web então iniciou um SQL Job que executou o trabalho e atualizou periodicamente uma tabela com o status do trabalho.Fornecemos uma IU que permitiu ao usuário consultar a tabela.

Encontrei exatamente esse problema em meu último trabalho.A melhor maneira que encontrei foi iniciar um processo assíncrono e notificar o usuário quando terminar (e-mail ou outra coisa).Fazê-los esperar tanto tempo será problemático devido ao tempo limite e ao desperdício de produtividade para eles.Fazê-los esperar por uma barra de progresso pode dar-lhes uma falsa sensação de segurança, pois podem cancelar o processo ao fechar o navegador, o que pode não ser o caso, dependendo de como você configurou o sistema.

  1. Como você está consultando os dados remotos?
  2. Com que frequência isso muda?
  3. Os resultados são algo que pode ser armazenado em cache por um período de tempo?
  4. De quanto tempo estamos realmente falando aqui?

O 'melhor método' provavelmente dependerá de alguma forma das respostas a estas perguntas...

Você pode criar outro thread e armazenar uma referência ao thread na sessão ou no estado do aplicativo, dependendo se o thread pode ser executado apenas uma vez por site ou uma vez por sessão de usuário.
Você pode então redirecionar o usuário para uma página onde ele pode monitorar o progresso dos threads.Você pode configurar a página para ser atualizada automaticamente ou exibir um botão de atualização para o usuário.
Após a conclusão do tópico, você pode enviar um e-mail ao usuário.

Minha solução para isso tem sido um serviço fora de banda que faz isso e os armazena em cache no banco de dados.

Quando a pessoa pede algo pela primeira vez, ela espera um pouco e depois aparece, mas se atualizar, é imediato, e então, porque é int he db, agora faz parte da atualização de hora em hora para o próximo 24 horas a partir da última solicitação.

Adicione o trabalho, com seus parâmetros relevantes, a uma tabela de fila de trabalhos.Em seguida, escreva um serviço do Windows que irá coletar esses trabalhos e processá-los, salvar os resultados em um local apropriado e enviar um e-mail ao solicitante com um link para os resultados.Também é um toque legal fornecer algum tipo de interface de usuário para que o usuário possa verificar o status de seu(s) trabalho(s).

Dessa forma, é muito melhor do que iniciar um thread separado ou aumentar o tempo limite, especialmente se seu aplicativo for maior e precisar ser escalonado, pois você pode simplesmente adicionar vários servidores para processar trabalhos, se necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top