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 никогда не достигнуто Такое поведение противоречит следующей информации, которую я прочитал:

Огонь и забудь на ASP.NET:

Если через 30 секунд все еще будут работать зарегистрированные объекты, ASP.NET вызоветIRegisteredObject.Stop(true) на них.ASP.NET выгрузит AppDomain после того, как все эти вторые уведомления вернутся.

Выполнение асинхронной работы или задач в приложениях ASP.NET:

Если вам нужно, вы можете задержать выгрузку столько, сколько захотите, потому что мы не будем выгружать, пока ваш метод Stop не вернется во второй раз.