rationalisation des mises à jour de l'interface graphique cross-thread en C #
Les applications multithread C # GUI nécessitent souvent une manipulation minutieuse des opérations transversales pour éviter les exceptions. Le modèle commun InvokeRequired
peut être lourd. Cet article explore une solution plus élégante en utilisant des méthodes d'extension.
Méthode d'extension pour la syntaxe simplifiée
Le noyau de la solution se trouve dans une méthode d'extension qui simplifie le InvokeRequired
Vérifier:
public static void InvokeIfRequired(this Control control, MethodInvoker action) { // ... Implementation (see original answer) ... }
Cela permet un code plus propre:
richEditControl1.InvokeIfRequired(() => { /* GUI actions */ });
Approche généralisée en utilisant IsynchronizeInvoke
Pour une applicabilité plus large, la méthode d'extension peut être adaptée pour fonctionner avec n'importe quel objet implémentant ISynchronizeInvoke
, pas seulement Control
objets:
public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action) { // ... Implementation (see original answer) ... }
résoudre les problèmes de visibilité
Une considération cruciale est la visibilité de l'élément GUI. L'appel InvokeIfRequired
sur un contrôle invisible peut entraîner des exceptions car InvokeRequired
renvoie false
. Bien qu'une while
la vérification de la boucle control.Visible
puisse être implémentée, cela peut introduire des problèmes de performances ou des blocs de non-blocs. Une stratégie plus robuste doit être utilisée pour s'assurer que le contrôle est visible avant d'essayer la mise à jour. Un examen attentif de l'architecture et du calendrier de l'application est essentiel pour éviter ce problème.
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!