rationaliser les mises à jour de l'interface utilisateur dans les GUIS motivés par des événements
Le développement de l'interface graphique axé sur les événements nécessite souvent la mise à jour des éléments d'interface utilisateur à partir des threads d'arrière-plan. La vérification standard InvokeRequired
peut conduire à un code répétitif et sujet aux erreurs. Cet article explore des solutions efficaces.
Le problème: fastidieux InvokeRequired
vérifie
L'approche typique des mises à jour de l'interface utilisateur en filetage est lourde:
<code class="language-csharp">private void UpdateUI() { if (myControl.InvokeRequired) { myControl.Invoke(new MethodInvoker(() => { UpdateUI(); })); } else { myControl.Text = "Updated Text"; } }</code>
Solution: Méthodes d'extension pour le code concis
Les méthodes d'extension fournissent une solution plus propre:
<code class="language-csharp">public static void SafeInvoke(this Control control, Action action) { if (control.InvokeRequired) { control.Invoke(action); } else { action(); } }</code>
Utilisation:
<code class="language-csharp">myControl.SafeInvoke(() => myControl.Text = "Updated Text");</code>
Expansion à ISynchronizeInvoke
Pour une applicabilité plus large, étendez la méthode pour prendre en charge tout objet ISynchronizeInvoke
:
<code class="language-csharp">public static void SafeInvoke(this ISynchronizeInvoke obj, Action action) { if (obj.InvokeRequired) { obj.Invoke(action, null); } else { action(); } }</code>
mises en garde de InvokeRequired
Bien que pratique, InvokeRequired
a des limites:
InvokeRequired
peut retourner incorrectement false
pour les contrôles invisibles, entraînant des exceptions transversales. Par conséquent, utilisez cette approche judicieusement. Considérez des alternatives comme BackgroundWorker
ou async
/ await
pour des scénarios complexes ou sensibles aux performances.
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!