Corretamente implementar segmento de processo em segundo plano no ASP.NET
Eu preciso executar um loop while infinito e quero iniciar a execução emglobal.asax
. Minha pergunta é como exatamente devo fazer isso? Devo iniciar um novo thread ou devo usar async e tarefas ou qualquer outra coisa? Dentro do loop while eu preciso fazerawait TaskEx.Delay(5000);
Como faço para que não bloqueie nenhum outro processo e não crie vazamentos de memória?
Eu uso VS10, AsyncCTP3, MVC4
EDITAR:
public void SignalRConnectionRecovery()
{
while (true)
{
Clients.SetConnectionTimeStamp(DateTime.UtcNow.ToString());
await TaskEx.Delay(5000);
}
}
Tudo o que preciso fazer é executar isso como uma instância singleton globalmente, desde que o aplicativo esteja disponível.
EDIT: RESOLVIDO
Esta é a solução final em Global.asax
protected void Application_Start()
{
Thread signalRConnectionRecovery = new Thread(SignalRConnectionRecovery);
signalRConnectionRecovery.IsBackground = true;
signalRConnectionRecovery.Start();
Application["SignalRConnectionRecovery"] = signalRConnectionRecovery;
}
protected void Application_End()
{
try
{
Thread signalRConnectionRecovery = (Thread)Application["SignalRConnectionRecovery"];
if (signalRConnectionRecovery != null && signalRConnectionRecovery.IsAlive)
{
signalRConnectionRecovery.Abort();
}
}
catch
{
///
}
}
Eu encontrei este artigo legal sobre como usar o trabalhador assíncrono:http://www.dotnetfunda.com/articles/article613-background-processes-in-asp-net-web-applications.aspx
E isto:http://code.msdn.microsoft.com/CSASPNETBackgroundWorker-dda8d7b6
Mas eu acho que para minhas necessidades esta será perfeita:http://forums.asp.net/t/1433665.aspx/1