Я создал веб-сервер ASP.NET MVC, который подключается к аппаратному устройству через сокет. Идея состоит в том, чтобы создать поток, который открывает сокет и прослушивает 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 и есть ли какие-либо решения для ее устранения?
Я сохранил исключение в базе данных, и все, что я получил, это «Поток был прерван».
@SamiKuhmonen спасибо за информацию, попробую. Для дальнейшего попробую сменить его на Службы Windows. Но я не знаю, безопасно ли создавать такой поток, я видел QueueBackgroundWorkItem, и это кажется лучшим подходом.
Пожалуйста, используйте приложение-службу Windows и не беспокойте ASP.NET, docs.lextudio.com/blog/…
Проблема, с которой вы столкнулись, вероятно, связана с тем, как IIS обрабатывает пулы приложений и рабочие процессы. IIS периодически перезапускает пулы приложений, что может привести к завершению фоновых потоков. Вот почему ваш длительный поток закрывается через определенный период времени.
Вы можете настроить параметры пула приложений в IIS, чтобы предотвратить его перезапуск.
Увеличьте время простоя:
Перейдите к настройкам пула приложений в IIS и увеличьте время ожидания простоя до большего значения или установите для него значение 0, чтобы отключить его.
Отключить регулярную переработку:
В дополнительных настройках пула приложений установите для «Регулярного интервала времени» перезапуска очень большое значение или отключите его.
В IIS есть настройки для остановки неиспользуемых приложений. Вы можете отключить его, и это может помочь здесь. Но в целом использовать веб-приложение для подобных целей — не лучшая идея, поскольку в некоторых случаях оно может быть переработано и его придется запускать заново с помощью запроса.