web-dev-qa-db-fra.com

Différence entre Task.Run et QueueBackgroundWorkItem dans Asp.Net

Quelle est exactement la différence en utilisant

Task.Run(() => { 
     LongRunningMethod();
});

ou

HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());

J'ai testé sur une application Asp.Net MVC dans laquelle j'ai continué à écrire une ligne dans un fichier texte pendant environ 10 minutes dans une tâche asynchrone qui est invoquée à l'aide de Task.Run ou QBWI.

Cela va bien à la fois en utilisant Task et QBWI. Ma méthode asynchrone continue d'écrire dans ce fichier sans aucun problème jusqu'à 10 minutes. Aucune perturbation de IIS j'ai observé concernant son recyclage.

Alors, quelle est la particularité de QueueBackgroundWorkItem?

39
Faisal Mq

Le documentation a une excellente explication:

Diffère d'un élément de travail ThreadPool normal en ce que ASP.NET peut garder une trace du nombre d'éléments de travail enregistrés via cette API en cours d'exécution, et le runtime ASP.NET essaiera de retarder l'arrêt AppDomain jusqu'à l'exécution de ces éléments de travail est terminée. Cette API ne peut pas être appelée en dehors d'un AppDomain géré par ASP.NET. Le CancellationToken fourni sera signalé lors de la fermeture de l'application.

Task.Factory.StartNew n'enregistre pas du tout le travail avec le runtime ASP.NET. Vous exécutez votre code pendant 10 minutes, cela ne fait aucune différence. IIS le recyclage se produit à des moments particuliers qui sont prédéfinis dans IIS . Si vous voulez vraiment tester ce qui se passe, vous pouvez essayer de forcer un recyclage .

35
Yuval Itzchakov

L'article ci-dessous explique quelque chose de similaire à ce que vous faites et si vous passez à la section finale "Moins de pensées ...", vous voyez la différence mise en évidence entre les deux

http://codingcanvas.com/using-hostingenvironment-queuebackgroundworkitem-to-run-background-tasks-in-asp-net/

Fondamentalement, il indique que l'utilisation des tâches queuebackgroundworkitem est enregistrée avec le runtime ASP.Net et si un processus est fermé ou se bloque, le runtime ASP.NET donne toujours un certain délai de grâce pour que les processus se terminent. Cela implique également d'envoyer une notification au processus afin qu'il puisse se terminer. et effectuer des tâches de finalisation alors que tout cela n'est pas disponible lorsque vous utilisez Task.Run

9
Jags

L'arrêt AppDomain ne peut être retardé que de 90 secondes (il s'agit en fait du minimum de HttpRuntimeSection.ShutdownTimeout et processModel shutdownTimeLimit). Si vous avez tellement d'éléments en file d'attente qu'ils ne peuvent pas être terminés en 90 secondes, le runtime ASP.NET déchargera l'AppDomain sans attendre la fin des éléments de travail.

https://blogs.msdn.Microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

3