Maison >développement back-end >C++ >En quoi les méthodes Async Void et Async Task diffèrent-elles dans la gestion des opérations en suspens dans ASP.NET ?
Nombre d'opérations en suspens dans Async Void et Async Task dans ASP.Net
Dans les applications ASP.Net, une méthode async void diffère de une méthode Task asynchrone dans sa gestion des opérations en suspens. Cette distinction peut conduire à l'exception suivante avec async void mais pas avec async Task :
System.InvalidOperationException: An asynchronous module or handler completed while an asynchronous operation was still pending
Comprendre Async Void
Async void incrémente le nombre d'opérations en attente lorsque appelé et le décrémente une fois terminé. Cela implique que cela n'entraîne pas vraiment un comportement « lancer et oublier », car ASP.Net suit son achèvement.
Pourquoi la tâche asynchrone fonctionne-t-elle ?
Quand renvoyant une tâche, le nombre d’opérations en attente n’augmente pas. Au lieu de cela, le framework gère l'attente de manière asynchrone que la tâche renvoyée soit terminée. Cette approche élimine le risque d'exception mentionnée ci-dessus.
Exemple
public class HomeController : AsyncController { // Will work fine (no exception) public async Task<ActionResult> ThisPageWillLoad() { // Fire and forget task this.FireAndForgetTask(); return await Task.FromResult(this.View("Index")); } private async Task FireAndForgetTask() { var task = Task.Delay(TimeSpan.FromSeconds(3)); await task; } // Will result in an exception due to async void public async Task<ActionResult> ThisPageWillNotLoad() { this.FireAndForgetVoid(); return await Task.FromResult(this.View("Index")); } private async void FireAndForgetVoid() { var task = Task.Delay(TimeSpan.FromSeconds(3)); await task; } }
Contexte historique
Microsoft a priorisé à rebours compatibilité et "un ASP.NET" lors de l'introduction de l'async à ASP.Net. Ils ont maintenu la prise en charge des composants EAP mais ont amélioré le noyau ASP.Net SynchronizationContext pour détecter et exclure toute utilisation inappropriée de async void dans certains scénarios. Dans le monde MVC/WebAPI/SignalR, les frameworks ont naturellement adopté la tâche asynchrone, éliminant ainsi le besoin de vide asynchrone.
Conclusion
Dans les applications ASP.Net modernes, il est généralement Il est recommandé d'éviter le vide asynchrone et de renvoyer la tâche à la place. Cette approche garantit un suivi approprié des opérations en suspens et élimine le risque d'exception susmentionnée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!