IRegisteredObject funktioniert nicht wie erwartet

Hintergrun

Ich arbeite an einer ASP.NET 4-Website (keine Webanwendung). Ich versuche, @ zu verwendIRegisteredObject, um zuzulassen, dass lang laufender Code in einem Nicht-Anforderungs-Thread ausgeführt wird.

Zum Testen habe ich das Wiederverwendungsintervall des IIS 7.5-Anwendungspools auf niedrige Werte festgelegt, damit er versucht, die Wiederverwendung durchzuführen, während der Hintergrundthread ausgeführt wird.

Cod
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);
            }
        }
    }
}
Proble

Wenn der Anwendungspool wiederverwendet wurde,IRegisteredObject.Stop wurde mit @ aufgerufimmediate einstellenfalse. Der Vorgang scheint jedoch vor @ zu endeStop kehrt zurück; der Aufruf anHostingEnvironment.UnregisterObject wird nie erreicht. Dieses Verhalten scheint den folgenden Informationen zu widersprechen, die ich gelesen habe:

Fire and Forget auf ASP.NET:

Wenn nach 30 Sekunden noch registrierte Objekte ausgeführt werden, ruft ASP.NET @ auIRegisteredObject.Stop(true) auf sie ASP.NET entlädt die AppDomain, nachdem alle diese zweiten Benachrichtigungen zurückgegeben wurden.

Assynchrone Arbeit oder Aufgaben in ASP.NET-Anwendungen ausführen:

Wenn Sie möchten, können Sie das Entladen so lange aufhalten, wie Sie möchten, da das Entladen erst erfolgt, wenn Ihre Stop-Methode das zweite Mal zurückgegeben wird.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage