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 не вернется во второй раз.

Ответы на вопрос(1)

Ваш ответ на вопрос