IRegisteredObject funktioniert nicht wie erwartet
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.
Codpublic 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);
}
}
}
}
ProbleWenn 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:
IRegisteredObject.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.