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>
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>
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>
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!