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>
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>
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 ?
É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 :
Cependant, dans certains cas, il peut être plus avantageux de dissocier la logique d'un gestionnaire d'événements asynchrone pour les raisons suivantes :
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>
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!