Comprendre C # Async et attendre les pièges
Les problèmes communs avec asynchronisation et attendre en C # incluent: 1. Utilisation incorrecte de .Result ou .Wait () provoque une impasse; 2. Ignorer ConfigureAwait (False) provoque des dépendances contextuelles; 3. L'abus d'Async Vide provoque un contrôle manquant; 4. L'attente en série affecte les performances de la concurrence. L'approche correcte est: 1. La méthode asynchrone doit être asynchrone tout le chemin pour éviter le blocage de la synchronisation; 2. L'utilisation de ConfigureAwait (false) dans la bibliothèque de classe est utilisée pour s'écarter du contexte; 3. Utiliser uniquement le vide asynchrone dans le traitement des événements; 4. Les tâches simultanées doivent d'abord être démarrées, puis attendre pour améliorer l'efficacité. Comprendre le mécanisme et normaliser l'utilisation du code asynchrone qui évite d'écrire un blocage substantiel.
L'asynchronisation et l'attente de C # facilitent la programmation asynchrone, mais il est facile de rester coincé si vous ne l'utilisez pas bien. Beaucoup de gens pensent qu'il est facile d'écrire au début, mais le programme est coincé, dans l'impasse ou n'est pas exécuté de manière asynchrone. En fait, le problème n'est pas la grammaire, mais la compréhension inadéquate et la mauvaise posture d'utilisation.

N'utilisez pas de résultat ou attendez () à volonté
Il s'agit de l'écueil le plus courant: afin d'appeler une méthode asynchrone dans une méthode synchrone, certaines personnes utilisent directement .Result
ou .Wait()
, qui provoquera un blocage des threads ou même une impasse s'ils sont accidentellement.

Par exemple, vous le faites dans le contexte d'un thread d'interface utilisateur ou d'une demande ASP.NET:
Var Result = SomeaSyncMethod (). Résultat;
Ce code peut provoquer une impasse. Parce await
essaiera de revenir dans le contexte d'origine pour continuer l'exécution, mais si ce contexte a été occupé par .Result
, il ne peut qu'attendre, en attendant que les deux côtés soient libérés, donc il a gelé.

suggestion:
- Si vous écrivez une méthode asynchrone, essayez d'être asynchrone jusqu'à la fin.
- Évitez de «transformer» de force en appels synchrones à l'extérieur de la méthode asynchrone.
- Si cela ne fonctionne vraiment pas, vous pouvez utiliser
ConfigureAwait(false)
pour éviter de capturer le contexte (j'en parlerai plus tard).
ConfigurationAwait oublié (false)
Par défaut, await
se souvient du contexte actuel de synchronisation et essaie de revenir à ce contexte lors de la reprise de l'exécution. Ceci est utile dans les applications d'interface utilisateur ou les demandes Web, mais peut poser des charges inutiles ou même des risques de blocage dans le code de la bibliothèque de classe.
Si vous écrivez une logique générale qui ne dépend pas d'un contexte spécifique, il est préférable d'ajouter:
attendre someaSyncMethod (). ConfigureAwait (false);
Cela permet d'exécuter le code ultérieur sur n'importe quel thread, réduisant la pression de la commutation de contexte.
Quand ne puis-je pas l'utiliser?
- Lors de la mise à jour des contrôles sur la couche d'interface utilisateur, le contexte d'origine est effectivement requis et il ne peut pas être ajouté pour le moment.
- Il est recommandé d'ajouter des services internes et de fond dans la bibliothèque de classe.
Utilisation incorrecte de vide asynchrone
En plus de la tâche asynchrone, il existe également une méthode asynchrone Void, mais elle a un objectif spécial - il est principalement utilisé pour gérer les fonctions de gestion des événements, telles que les points de déclenchement tels que les clics de bouton.
Mais si vous écrivez une méthode aléatoire Async Void et l'appelez, vous perdez le contrôle dessus. Une exception ne sera pas prise correctement et l'appelant ne peut pas attendre qu'il se termine.
suggestion:
- Essayez d'éviter de définir vous-même la méthode vide asynchrone.
- Utilisez-le uniquement lorsque les événements doivent être répondus, comme dans l'abonnement à l'événement de la méthode.
- La tâche asynchrone est utilisée dans d'autres endroits.
L'ordre de concurrence et d'attente affecte les performances
Parfois, vous pensez que plusieurs opérations asynchrones sont exécutées en parallèle, mais en fait, elles sont exécutées en série uniquement parce que vous avez écrit du code comme ceci:
var result1 = attendre getFirstasync (); var result2 = attendre getSecondasync ();
Ce code commence en fait le second une fois le premier terminé. Si vous souhaitez initier plusieurs demandes en même temps, vous devez d'abord démarrer les tâches, puis les attendre:
var task1 = getFirstasync (); var tâche2 = getSecondasync (); var result1 = attendre la tâche1; var result2 = attendre la tâche2;
De cette façon, les deux tâches peuvent être exécutées simultanément, ce qui les rend plus efficaces.
Avis:
- Si vous utilisez
Task.WhenAll
. Lorsque vous êtes en train de vous assurer que toutes les tâches ont été lancées avant d'être transmises. - Les attentes multiples sont écrits simultanément ≠ simultanément.
Fondamentalement, c'est tout. L'async et l'attente sont faciles à utiliser, mais le mécanisme derrière n'est pas clair, il est donc facile d'écrire du code qui semble asynchrone mais qui est en fait bloqué. Surtout dans les environnements où les pools de threads sont serrés ou restreints par le contexte, ces problèmes sont plus susceptibles d'être exposés.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

TPL de C # simplifie le traitement des tâches parallèles via la classe de tâches. 1. Utilisez Task.Run () ou Task.factory.startNew () pour démarrer la tâche et recommander le premier; 2. Obtenez le résultat via la tâche et attendez l'achèvement avec Await ou .result; 3. Utilisez la tâche.Whenall () pour exécuter plusieurs tâches en parallèle, faites attention à la concurrence des ressources; 4. Utilisez AggregateException pour gérer les exceptions et parcourez les erreurs spécifiques après la capture; 5. Utilisez l'annulation de l'annulation pour annuler la tâche, ce qui convient aux scénarios d'annulation de délai d'attente ou d'utilisateur; Dans le même temps, faites attention à éviter de mélanger le code synchrone et asynchrone pour éviter les problèmes de blocage.

Lors de l'utilisation de VAR, il doit être déterminé en fonction de la question de savoir si le type est clair et si la lisibilité est affectée. 1. Lorsque le type est clair sur le côté droit de l'affectation, tel que varList = newList (); peut améliorer la simplicité du code; 2. Lorsque le type est flou ou revient à l'objet ou au type d'interface, VAR doit être évité, comme ienumerableResult = SomeMethod (); pour améliorer la lisibilité; 3. Utilisez VAR raisonnablement dans les types anonymes et les requêtes LINQ, telles que la réception d'objets anonymes, mais un traitement ultérieur est recommandé de le résumer comme un type spécifique; 4. Dans les projets d'équipe, le style de codage doit être unifié et la VAR doit être utilisée raisonnablement à travers .editorconfig ou la revue de code pour éviter les abus et affecter l'entretien.

La comparaison des chaînes en C # doit être basée sur la méthode de sélection de scène. L'opérateur == est sensible à la casse par défaut et comparé sur la base de la culture actuelle, mais ne convient pas aux scénarios complexes. 1. L'utilisation de l'opérateur == convient à une comparaison rapide, mais peut ne pas répondre aux résultats attendus dus à la culture ou au cas; 2. Utilisation de String.equals () et de la transmission dans l'énumération de la compatissement de la chaîne peut obtenir un contrôle plus précis, tel que ordinal, OrdinalIgnoreCase, InvariantCulture, etc.; 3. Faites attention à la manipulation des cordes nulles ou vides en comparant. Il est recommandé d'utiliser la méthode statique String.equals () ou d'utiliser String.isnullOrempt d'abord.

Les expressions Lambda sont utilisées en C # pour écrire des fonctions anonymes en ligne qui peuvent être utilisées partout où vous devez déléguer. Ils sont simples et flexibles, particulièrement adaptés au code LINQ ou asynchrone. Les expressions lambda utilisent l'opérateur =>, à gauche, sont des paramètres d'entrée, à droite sont des expressions ou des blocs d'instruction; Par exemple, x => xx représente un lambda qui accepte x et renvoie son carré. S'il y a plusieurs paramètres, il doit être enveloppé dans des supports, tels que (INTX, INTY) => x Y, le type peut être omis et déduit par le compilateur. Les utilisations courantes incluent la requête LINQ, le traitement des événements, la programmation asynchrone, etc., comme les nombres. Contrairement à la méthode conventionnelle, Lambda

Pour se connecter à une base de données SQLServer, la façon la plus courante de C # est d'utiliser la classe SQLConnection dans ADO.NET. 1. Vous devez installer le package Microsoft.Data.SqlClient et référence à l'espace de noms; 2. Écrivez une chaîne de connexion contenant l'adresse du serveur, le nom de la base de données et les informations d'authentification; 3. Utilisez l'utilisation et le coup d'essai pour établir une connexion et exécuter des requêtes, tout en garantissant la libération des ressources et la gestion des exceptions; 4. Les problèmes courants incluent les paramètres de connexion distante, la configuration du pare-feu, la libération de port et les autorisations de connexion, etc., et doivent être vérifiées un par un.

Il existe deux façons courantes de lire les fichiers texte ligne par ligne en C #: Utilisation de StreamReader et File.Readlines (). 1. La méthode ReadLine () de StreamReader convient au traitement des fichiers volumineux, à lire la ligne par ligne par ligne et à faire la mémoire et utilise l'utilisation pour assurer la libération des ressources; 2. File.readlines () fournit du code concis, adapté aux scénarios qui ne doivent être traversés qu'une seule fois, prend en charge le chargement paresseux et peuvent spécifier le codage. Si vous devez accéder au contenu du fichier plusieurs fois, file.readalllines () est recommandé. Les deux reconnaissent automatiquement le codage par défaut, mais pour éviter le code brouillé, il est recommandé de spécifier explicitement Encoding.Utf8 et Enc selon les besoins.

Le choix du bon type de collection peut améliorer considérablement les performances du programme C #. 1. Insérer ou supprimer fréquemment la liste liée au milieu, 2. Recherchez rapidement en utilisant HashSet ou Dictionary, 3. Correction des éléments fixes pour utiliser d'abord les tableaux, 4. Sélectionnez HashSet lorsque des valeurs uniques sont nécessaires, 5. Recherche fréquemment en utilisant un dictionnaire ou un environnement tridable.

C # Can BeBeusedForscidificCompupingAndDataanalysySettingUpAproperenvironment, LeverageRagingRelantLibrary, andoptimizingperformance.first, installvisualstudioorvscodewiththe.netsdkasthefoundation.next, usenudioorvsewithat
