IRegisteredObject не работает должным образом
Я работаю над веб-сайтом ASP.NET 4 (не веб-приложением). Я пытаюсь использоватьIRegisteredObject
разрешить запуск некоторого долго выполняющегося кода в потоке без запроса.
Для тестирования я установил низкий интервал перезапуска пула приложений IIS 7.5, чтобы он пытался перезапускать во время работы фонового потока.
Кодpublic class AspFriendlyBackgroundJob
{
private readonly object key = new object();
private readonly Task task;
public AspFriendlyBackgroundJob(Action work)
{
lock (key)
{
HostingEnvironment.RegisterObject(new Stopper(this));
task = Task.Factory.StartNew(work);
}
}
class Stopper : IRegisteredObject
{
private readonly AspFriendlyBackgroundJob job;
public Stopper(AspFriendlyBackgroundJob job)
{
this.job = job;
}
public void Stop(bool immediate)
{
lock (job.key)
{
job.task.Wait();
HostingEnvironment.UnregisterObject(this);
}
}
}
}
проблемаКогда пул приложений был переработан,IRegisteredObject.Stop
был вызван сimmediate
установлен вfalse
, Тем не менее, процесс, как представляется, завершается доStop
возвращается; призыв кHostingEnvironment.UnregisterObject
никогда не достигнуто Такое поведение противоречит следующей информации, которую я прочитал:
IRegisteredObject.Stop(true)
на них.ASP.NET выгрузит AppDomain после того, как все эти вторые уведомления вернутся.Выполнение асинхронной работы или задач в приложениях ASP.NET:
Если вам нужно, вы можете задержать выгрузку столько, сколько захотите, потому что мы не будем выгружать, пока ваш метод Stop не вернется во второй раз.