await
, come hai scoperto, blocca la risposta dal ritorno all'utente prima che sia terminata. Normalmente dovresti mettere il tuo lavoro in background su un altro thread e impostarlo su "fire and forget" non aspettando, tuttavia in ASP.NET IIS chiuderà AppDomains che non vengono utilizzati e non informa IIS che il tuo thread in background " sta utilizzando l'AppDomain "in modo che il thread in background possa essere terminato con un Thread.Abort()
durante un arresto di AppDomain.
Se si utilizza .NET 4.5.2 o successivo, è possibile indicare a IIS che si dispone di un worker in background che è necessario mantenere in vita tramite QueueBackgroundWorkItem
. Si potrebbe usare in questo modo
public ActionResult ProcessRec()
{
HostingEnvironment.QueueBackgroundWorkItem(waitTimer);
return RedirectToAction("Index", "Home");
}
public void waitTimer(CancellationToken token)
{
Thread.Sleep(10000);
}
//You also could do
public async Task waitTimer2(CancellationToken token)
{
await Task.Delay(10000);
}
Ora, questo non garantisce che IIS non spegnere il dominio applicazione ma non farle sapere siete nel bel mezzo di qualcosa e chiede più tempo quando non tenta di spegnerlo (si ottengono fino a 90 secondi aggiuntivi dopo l'avvio di uno spegnimento per completare tutti gli elementi di sfondo in coda per impostazione predefinita).
Per ulteriori informazioni leggere this MSDN blog introducendolo.
fonte
2015-05-24 03:40:57
Quale versione di .NET stai usando. .NET 4.5.2 ha introdotto una funzionalità per rendere questo "corretto" più facile. –
Sto usando .NET 4.5 –
Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –