Maison > développement back-end > C++ > Gestionnaires d'événements asynchrones: pour utiliser `Async void` ou non?

Gestionnaires d'événements asynchrones: pour utiliser `Async void` ou non?

Patricia Arquette
Libérer: 2025-01-26 02:41:07
original
798 Les gens l'ont consulté

Async Event Handlers: To Use `async void` or Not?

Gestionnaires d'événements asynchrones : une analyse approfondie de l'utilisation async void

Bien qu'il soit généralement admis d'éviter l'approche « tirer et oublier » async void, la question est : les gestionnaires d'événements void asynchrones doivent-ils également être évités ?

Considérez l'extrait de code suivant :

<code class="language-csharp">private async void Form_Load(object sender, System.EventArgs e)
{
    await Task.Delay(2000); // 执行异步操作
    // ...
}</code>
Copier après la connexion

Comme alternative, une approche plus structurée peut être choisie :

<code class="language-csharp">Task onFormLoadTask = null;

private void Form_Load(object sender, System.EventArgs e)
{
    this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
}

private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
    await Task.Delay(2000); // 执行异步操作
    // ...
}</code>
Copier après la connexion

Outre les problèmes potentiels de réentrance, quels sont les pièges cachés liés à l'utilisation de gestionnaires d'événements asynchrones ?

Directives et risques potentiels

Étonnamment, les directives générales recommandent d'utiliser async void dans les gestionnaires d'événements, ce qui en fait une exception à la règle « ne pas utiliser async void ». C'est parce que :

  • Les gestionnaires d'événements sont généralement des méthodes anonymes utilisées pour répondre à des événements spécifiques et ne participent pas au flux de contrôle traditionnel.
  • Si des exceptions se produisent dans un gestionnaire d'événements asynchrone, elles sont automatiquement propagées au gestionnaire d'exceptions du thread de l'interface utilisateur, ce qui facilite leur gestion.

Cependant, dans certains cas, il peut être plus avantageux de dissocier la logique d'un gestionnaire d'événements asynchrone pour les raisons suivantes :

  • Tests unitaires : il simplifie la simulation et les tests séparés des fonctionnalités de base d'un gestionnaire d'événements.
  • Lisibilité du code : En séparant le code asynchrone de la logique de traitement des événements, la lisibilité du code peut être améliorée.

Exemple :

<code class="language-csharp">public async Task OnFormLoadAsync(object sender, EventArgs e)
{
    await Task.Delay(2000);
    ...
}

private async void Form_Load(object sender, EventArgs e)
{
    await OnFormLoadAsync(sender, e);
}</code>
Copier après la connexion

En suivant ces directives, vous pouvez utiliser efficacement les gestionnaires d'événements asynchrones tout en atténuant les risques potentiels et en garantissant la maintenabilité 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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal