Maison >développement back-end >C++ >Quand et pourquoi « async void » est-il une mauvaise pratique en C# ?

Quand et pourquoi « async void » est-il une mauvaise pratique en C# ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 13:23:55650parcourir

When and Why Is `async void` a Bad Practice in C#?

Quand et pourquoi async void est-il considéré comme une mauvaise pratique ?

Comprendre le contexte :

Les méthodes asynchrones en C# peuvent renvoyer soit Tâche, soit vide. Bien que les méthodes async void puissent sembler pratiques dans certains scénarios, elles introduisent des inconvénients potentiels qui les rendent généralement déconseillées. Examinons pourquoi le vide asynchrone est considéré comme une mauvaise pratique et comment aborder ces situations plus efficacement.

Raisons d'éviter le vide asynchrone :

  1. Gestion des erreurs Défis :
    Contrairement aux méthodes de tâches asynchrones, les exceptions s'échappant des méthodes vides asynchrones ont des caractéristiques non conventionnelles. sémantique de gestion des erreurs, ce qui rend difficile leur gestion appropriée.
  2. Défis de composition :
    Les méthodes vides asynchrones ne peuvent pas être facilement composées en méthodes asynchrones de niveau supérieur. Cela limite la maintenabilité et la réutilisation du code.
  3. Difficultés des tests :
    Les tests unitaires des méthodes void asynchrones sont nettement plus complexes que les tests des méthodes de tâches asynchrones, en raison de la sémantique unique de gestion des erreurs et de composition. .

Alternative Approches :

Dans l'exemple fourni, où l'accent est mis sur la réaction à un clic sur un bouton sans attendre le résultat, une approche plus appropriée consiste à définir la méthode PrimeCustomTask comme tâche asynchrone et à utiliser la méthode OnLoad comme un point d’entrée pour démarrer l’opération asynchrone. De cette façon, tous les avantages des méthodes Task asynchrones sont préservés :

protected override async void OnLoad(EventArgs e)
{
    if (CustomTask == null)
        await PrimeCustomTask();
}

private async Task PrimeCustomTask()
{
    CustomTask = new TaskCompletionSource<int>();
    while (CustomTask.Task.IsCompleted == false && IsDisposed == false) 
    {
        // Wait for button click to set the value
        await Task.Delay(100); 
    }

    int result = CustomTask.Task.Result;

    // Show the value
    if (result != 0) MessageBox.Show(result.ToString());
}

En adhérant à ces directives, vous pouvez éviter les pièges des méthodes void asynchrones et améliorer la maintenabilité, la réutilisabilité et la testabilité de votre code.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn