Maison > développement back-end > C++ > Devriez-vous éviter les gestionnaires d'événements Async Void ?

Devriez-vous éviter les gestionnaires d'événements Async Void ?

Patricia Arquette
Libérer: 2025-01-26 02:46:09
original
815 Les gens l'ont consulté

Should You Avoid Async Void Event Handlers?

async void Gestionnaires d'événements : faut-il les éviter ?

En général, les meilleures pratiques recommandent d'éviter d'utiliser les méthodes async void, en particulier lors du démarrage de tâches, car elles manquent de mécanismes pour suivre les tâches en attente et ont une gestion des exceptions plus complexe. Mais ce principe s'applique-t-il également aux async void gestionnaires d'événements ?

Regardons un exemple :

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

Au lieu d'utiliser cette méthode, pourquoi ne pas repenser le code pour implémenter des fonctions de suivi et d'annulation des tâches :

<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éentrée, async void Y a-t-il des pièges cachés avec les gestionnaires d'événements ?

Le fait est que l'utilisation de async void est déconseillée dans les contextes où les exceptions ne peuvent pas être gérées avec élégance. Cependant, au sein des gestionnaires d'événements, les exceptions sont acheminées vers le gestionnaire d'exceptions global, garantissant qu'elles sont interceptées et traitées de manière appropriée sans qu'il soit nécessaire de gérer explicitement les erreurs dans le gestionnaire d'événements lui-même. C’est la différence clé qui rend async void acceptable dans ce cas précis.

Pour les tests unitaires, la pratique courante consiste à extraire la logique de toutes les async void méthodes de manière isolée :

<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 conclusion, bien que l'utilisation des méthodes async void ne soit généralement pas recommandée, il est acceptable de les utiliser dans les gestionnaires d'événements async void en raison du mécanisme de gestion des exceptions inhérent au framework de gestionnaire d'événements. Par conséquent, vous pouvez utiliser async void dans les gestionnaires d'événements sans enfreindre les meilleures pratiques.

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