Pergunta

Considere este código ...

using System.Threading;
//...
Timer someWork = new Timer(
    delegate(object state) {
        //Do some work here...
    },
    null, 0, 60000);

HttpContext.Current.Application["SomeWorkItem"] = someWork;

Isso poderia ser perigoso? Cache um temporizador na aplicação que permite realizar algum trabalho em segundo plano enquanto seu site corre parece seguro, mas gostaria de saber se alguém tem alguma experiência com isso.

Eu tenho certeza que escrever um serviço para ser executado em segundo plano seria certamente muito melhor, mas às vezes isso nem sempre é uma opção. É este uma alternativa?

Foi útil?

Solução

Este geralmente seria uma má idéia, como System.Threading.Timer utiliza threads do ThreadPool, o mesmo que ASP.Net.

Se para o que sempre razão seus blocos de delegado temporizador ou paradas, o temporizador irá simplesmente iniciar um novo tópico após o período de tempo limite, que come-se para os segmentos disponíveis para ASP.net.

Se todos eles começam a bloquear, de forma eficaz você não será capaz de servir mais solicitações web (provavelmente uma coisa ruim)

Outras dicas

O problema com isso é que você não está garantido o processo ainda estar vivo. IIS irá recuperar o processo, basicamente, sempre que se sente como ele, então você corre o risco de não ser realizada.

Se você precisa este trabalho feito, então você precisa se quer código-lo em uma chamada web, ou ter um serviço em execução no plano de fundo do servidor.

Isso seria perigoso como pode haver momentos em que o processo de trabalho é reciclado ou o AppDomain deixa de funcionar eo item de trabalho é morto e você pode querer-lo para recuperar o que estava fazendo, pode não ser possível.

Um serviço de Windows pode ser OK se você pode obter esse item de trabalho para fora em um serviço. Se um HttpContext é necessário para o trabalho que você pode querer ter uma chamada de serviço janelas um webservice para fazer a chamada periodicamente que pode funcionar, embora provavelmente não ideal.

Isso faz sentido, mas apenas para se divertir, e se o trabalho não precisa correr se o site fica desligado? Se ele é associado com o evento Application_Start e só precisa ser executado enquanto as pessoas estão navegando no site, quais são os riscos nesse ponto?

Boas respostas, eu sou apenas um curioso um pouco mais sobre como isso funciona no interior.

Eu recomendo que você configurar uma tarefa agendada para executar uma página em seu site. Eu costumo apontar a tarefa agendada para um arquivo .vbs com o seguinte:

On Error Resume Next
Dim objRequest
Dim URL

Set objRequest = CreateObject("Microsoft.XMLHTTP")
URL = "http://www.mywebsite.com/cron/pagetorun.ashx"

objRequest.open "POST", URL , false

objRequest.Send

Set objRequest = Nothing

Omar Al Zabir tem um excelente post sobre o uso de chamadas de retorno item de cache para esta finalidade.

http://www.codeproject.com/KB/aspnet/ASPNETService.aspx?fid=229682&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=1334820

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