Qual é a melhor prática para iniciar o processo de manutenção no ASP.NET [fechado]

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Dado um aplicativo ASP.NET, preciso executar um processo de manutenção regularmente (diariamente, de hora em hora, etc.).

Qual é a melhor maneira de fazer isso sem depender de um processo externo, como uma tarefa agendada no servidor (suponha que não tenha acesso ao servidor - ambiente de hospedagem compartilhada).

Foi útil?

Solução

Esta é a maneira como o StackOverflow faz isso:

private static CacheItemRemovedCallback OnCacheRemove = null;

protected void Application_Start(object sender, EventArgs e)
{
    AddTask("DoStuff", 60);
}

private void AddTask(string name, int seconds)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, seconds, null,
        DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration,
        CacheItemPriority.NotRemovable, OnCacheRemove);
}

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
    // do stuff here if it matches our taskname, like WebRequest
    // re-add our task so it recurs
    AddTask(k, Convert.ToInt32(v));
}

Detalhes: http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

Outras dicas

Uma maneira de fazer isso, se você não precisa fazer isso em um horário agendado, mas só precisa fazer uma limpeza "de vez em quando", é criar uma função no seu Global.asax Session_OnEnd() que criará um arquivo aleatório número entre 1 e 100, e se o número for, digamos, 50, você executa a tarefa de manutenção.

É claro que você pode reduzir o "100" para que a tarefa aconteça com mais frequência.

Também existe um artigo intitulado 'Simular um serviço do Windows usando ASP.NET para executar trabalhos agendados' em http://www.codeproject.com/aspnet/ASPNETService.asp que usa um cache expirado para simular um cronômetro.Ele afirma que pode ser executado em qualquer site hospedado.

Se você estiver usando a última, leia este comentário de uma postagem sobre esta técnica:

Você precisa realmente ter cuidado com a duração da tarefa em execução.Cada nova tarefa é um novo tópico de trabalhador e há um número limitado desses - pois "empresta" um thread do pool de threads gerenciados.

A partir da v3.5 da estrutura, o número máximo de roscas aumentou 10x de 25 para 250.Mas agora há uma startup logarítmica neles, então, ao distribuir mais threads, fica mais arrogante com eles.Se você ficar sem tópicos disponíveis no pool de threads gerenciados - seus tempos de resposta passarão pelo telhado.

O que você está realmente escrevendo aqui é um sistema de mensagens/filas.

Se você está fazendo coisas como atualizar o cache, então, por todos os meios - inicie uma nova tarefa.Se você estiver fazendo algo como baixar um recurso HTTP secundário ou algum tipo de trabalho intensivo de banco de dados - escreva um serviço do Windows e use uma fila que permita mais controle sobre o quanto você "morde" a cada vez.

Embora a solução Cache funcione para casos simples, se sua programação precisar mudar, você não terá sorte.Em vez disso, você poderia usar Quartz.NET, uma porta do popular framework java Quartzo, que é muito flexível.

Embora a maneira como o StackOverflow faz isso seja definitivamente única, você pode querer monitorar isso pergunta também, uma vez que se relaciona.

este é um processo externo e não sei quão confiável, mas você pode configurar algo semelhante em uma máquina que você sabe que está sempre ligada www.webcron.org.

Basicamente, o que ele faz é acessar uma página solicitada na programação solicitada.

Basicamente, você poderia fazer com que qualquer coisa chegasse a uma página regularmente, o que daria início à sua tarefa de manutenção.

Jeff e Joel também discutiram como fazer coisas semelhantes em um podcast recente por meio de outros métodos.

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