Eu construí um servidor web ASP.NET MVC que se conecta a um dispositivo de hardware por meio de um soquete. A ideia é gerar um thread que abra um soquete e escute pacotes TCP do hardware. Como o hardware executa uma tarefa de longa duração que leva um tempo significativo para ser concluída (anos), quero manter o thread ativo o maior tempo possível para monitorar o processo usando SignalR e salvar alguns dados no banco de dados.
Para conseguir isso, criei um tópico como segue:
rs = new TcpListener(IPAddress.Any, PORT_DATA_NUMBER());
rs.Start();
Thread thread = new Thread(() => ListenerHandleConnections(rs));
thread.IsBackground = true;
thread.Start();
O fluxo de trabalho do thread é o seguinte:
public static void ListenerHandleConnections(TcpListener listener)
{
try
{
TcpClient client;
while (true)
{
try
{
client = listener.AcceptTcpClient();
//extract data and doing some task
}
catch (Exception ex)
{
//Doing some task
}
}
}
catch (Exception ex)
{
//Doing some task
}
}
O problema que estou enfrentando é que quando eu implanto isso no IIS e o executo por mais de 2 horas, o thread é eliminado e nenhum processo escuta mais o hardware. Esse problema é causado pelo IIS e há alguma solução para corrigi-lo?
Salvei a exceção no banco de dados e tudo que obtive foi "Thread estava sendo abortado".
O problema que você está enfrentando provavelmente está relacionado ao modo como o IIS lida com pools de aplicativos e processos de trabalho. O IIS recicla pools de aplicativos periodicamente, o que pode causar o encerramento de threads em segundo plano. É por isso que seu thread de longa duração é eliminado após um determinado período de tempo.
Você pode ajustar as configurações do pool de aplicativos no IIS para evitar sua reciclagem.
Aumente o tempo limite de inatividade:
Vá para as configurações do pool de aplicativos no IIS e aumente o tempo limite de inatividade para um valor maior ou defina-o como 0 para desativá-lo.
Desative a reciclagem regular:
Nas configurações avançadas do pool de aplicativos, defina o "Intervalo de tempo regular" para reciclagem com um valor muito alto ou desative-o.