我构建了一个 ASP.NET MVC Web 服务器,它通过套接字连接到硬件设备。这个想法是生成一个线程,打开套接字并侦听来自硬件的 TCP 包。由于硬件执行的是一项需要大量时间(数年)才能完成的长期任务,因此我希望尽可能长时间地保持线程处于活动状态,以便使用 SignalR 监视进程并将一些数据保存到数据库。
为了实现这一点,我创建了一个如下的线程:
rs = new TcpListener(IPAddress.Any, PORT_DATA_NUMBER());
rs.Start();
Thread thread = new Thread(() => ListenerHandleConnections(rs));
thread.IsBackground = true;
thread.Start();
线程工作流程如下:
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
}
}
我面临的问题是,当我将其部署到 IIS 并运行超过 2 小时时,线程被终止,并且没有进程再监听硬件。这个问题是由 IIS 引起的吗?有什么解决方案可以解决它吗?
我已将异常保存到数据库,而我得到的只是“线程正在中止”。
您面临的问题可能与 IIS 处理应用程序池和工作进程的方式有关。IIS 会定期回收应用程序池,这可能会导致后台线程终止。这就是为什么您的长时间运行的线程会在一段时间后被终止的原因。
您可以调整IIS中的应用程序池设置,以防止其回收。
增加空闲超时:
转到 IIS 中的应用程序池设置,将空闲超时增加为更大的值或将其设置为 0 以禁用它。
禁用常规回收:
在应用程序池的高级设置中,将回收的“常规时间间隔”设置为非常高的值或禁用它。