IRegisteredObject no funciona como se esperaba
Estoy trabajando en un sitio web ASP.NET 4 (no en una aplicación web). Estoy tratando de usarIRegisteredObject
para permitir que se ejecute un código de ejecución prolongada en un subproceso que no sea de solicitud.
Para las pruebas, configuré el intervalo de reciclaje del grupo de aplicaciones IIS 7.5 en valores bajos para que intente reciclar mientras se ejecuta el subproceso en segundo plano.
Códigopublic 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);
}
}
}
}
ProblemaCuando se recicló el grupo de aplicaciones,IRegisteredObject.Stop
fue llamado conimmediate
ajustado afalse
. Sin embargo, el proceso parece terminar antesStop
devoluciones; la llamada aHostingEnvironment.UnregisterObject
nunca se alcanza. Este comportamiento parece contrario a la siguiente información que leí:
IRegisteredObject.Stop(true)
en ellos.ASP.NET descargará el dominio de aplicación después de que hayan regresado todas esas segundas notificaciones.Realización de trabajo asincrónico, o tareas, en aplicaciones ASP.NET:
Si lo necesita, puede retrasar la descarga todo el tiempo que desee, porque no la descargaremos hasta que su método Stop vuelva por segunda vez.