У меня была аналогичная проблема, я разрабатываю доказательство концепции ASP и использую фоновый поток, который выполняет задачу, которая может занять несколько часов. Проблема в том, что ASP.Net может повторно использовать AppDomain в любое время (убивая мой фоновый поток).
Чтобы предотвратить это, вы можете зарегистрировать свой фоновый поток в ASP.Net, чтобы он уведомлял ваш поток о завершении работы. Для этого реализуйте следующий интерфейс:
public interface IRegisteredObject
{
void Stop(bool immediate);
}
И зарегистрируйте свой объект в ASP, используя следующий статический метод:
HostingEnvironment.RegisterObject(this);
Когда ASP.NET разрушает домен приложения, он сначала пытается вызвать метод Stop для всех зарегистрированных объектов. В большинстве случаев он вызывает этот метод дважды, один раз со значением false. Это дает вашему коду немного времени, чтобы завершить то, что он делает. ASP.NET дает всем экземплярам IRegisteredObject в общей сложности 30 секунд для завершения своей работы, а не 30 секунд каждому. По истечении этого промежутка времени, если остались какие-либо зарегистрированные объекты, он вызовет их снова с немедленным значением true.
Предотвращая возврат метода Stop (блокируя поле, когда рабочий занят), мы не позволяем ASP завершать работу AppDomain до тех пор, пока наша работа не будет завершена.
public void Stop(bool immediate)
{
lock (_lock)
{
_shuttingDown = true;
}
HostingEnvironment.UnregisterObject(this);
}
public void DoWork(Action work)
{
lock (_lock)
{
if (_shuttingDown)
{
return;
}
work();
}
}
Используйте задачу вместо действия, чтобы воспользоваться опциями отмены. В вашем конкретном случае вы можете запустить таймер, который выполняет подобные задачи.
PS. Это взлом, и ASP не предназначен для выполнения фоновых задач, поэтому по возможности используйте службу Windows или службу WCF! Я использую его, поскольку он упрощает разработку, обслуживание и установку.
Для получения дополнительной информации см. Мой источник: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx
person
Rob
schedule
13.06.2013