web-dev-qa-db-fra.com

C # Async attendre le problème de blocage bloqué dans .NetCore?

Dans .NetFramework, le risque d’interblocage était élevé lors de la synchronisation avec le contexte de synchronisation en utilisant:

var result =  asyncMethod().Result; 
var result =  asyncMethod().GetAwaiter().GetResult();

au lieu de

var result = await asyncMethod();

( lire le message de Stephen Cleary pour plus d'informations )

Depuis que le contexte de synchronisation a été supprimé dans .NetCore. Est-ce que cela signifie que les méthodes ci-dessus sont maintenant sécuritaires?

6
Lillem4n

Vous pouvez bloquer sur du code async - mais vous ne devriez pas le faire

La conséquence première et la plus évidente est qu'il n'y a pas de contexte capturé par wait. Cela signifie que bloquer sur du code asynchrone ne causera pas de blocage. Vous pouvez utiliser Task.GetAwaiter (). GetResult () (ou Task.Wait ou Task.Result) sans crainte de blocage .. Cependant, vous ne devriez pas le faire, car dès que vous bloquez du code asynchrone, vous renoncez à tous les avantages du code asynchrone. La scalabilité améliorée des gestionnaires asynchrones est annulé dès que vous bloquez un thread . Il y avait quelques scénarios dans ASP.NET (hérité) où le blocage était malheureusement nécessaire: filtres ASP.NET MVC et actions enfants. Cependant, dans ASP.NET Core, l'intégralité du le pipeline est totalement asynchrone; les filtres et les composants de vue s'exécutent de manière asynchrone . En conclusion, idéalement, vous devez vous efforcer d'utiliser le code asynchrone au maximum, mais si votre code le requiert, il peut bloquer sans danger.

- Extrait de blogpost par Stephen Cleary

Crédit à GSerg pour trouver le poste

Cependant, vous pourriez rencontrer un manque de pool de threads

http://labs.criteo.com/2018/10/net-threadpool-starvation-and-how-queuing-makes-it-worse/

1
Lillem4n

Oui et non. Il est vrai qu'il n'y a pas de contexte de synchronisation dans .NET Core et, par conséquent, l'une des principales sources de problèmes d'interblocage a été éliminée. Cependant, cela ne signifie pas que les blocages sont totalement impossibles. Quoi qu'il en soit, vous ne devez pas laisser les bonnes pratiques de programmation glisser, simplement parce que cela peut ne plus être un gros problème dans une circonstance. ASP.NET Core, en particulier, est entièrement async. Il n’ya donc aucune raison de toujours utiliser une version de synchronisation d’une méthode ou de simplement bloquer une tâche asynchrone. Utilisez await comme vous le feriez et devriez le toujours.

3
Chris Pratt