Le mode de code invoqué traditionnel est compliqué et frustrant dans le traitement des événements GUI. Ce mode doit vérifier si le thread actuel peut accéder à la poignée du contrôle.
Afin de résoudre ce problème, nous avons amélioré la méthode de LEE et développé une méthode simplifiée:
Cette méthode a élargi la classe de contrôle.
public static void InvokeIfRequired(this Control control, MethodInvoker action) { // 检查可见性,如有必要则调用 while (!control.Visible) { System.Threading.Thread.Sleep(50); } if (control.InvokeRequired) { control.Invoke(action); } else { action(); } }
Pour la situation qui doit être retournée, vous pouvez utiliser cette implémentation de remplacement:
richEditControl1.InvokeIfRequired(() => { // 操作控件 richEditControl1.RtfText = value; RtfHelpers.AddMissingStyles(richEditControl1); });
En plus du contrôle, l'interface isynchronizeinvoke peut également bénéficier de cette méthode:
private static T InvokeIfRequiredReturn<T>(this Control control, Func<T> function) { if (control.InvokeRequired) { return (T)control.Invoke(function); } else { return function(); } }
Il convient de noter qu'IsynchronizeInvoke a besoin d'un tableau d'objets comme liste de paramètres de la méthode invoquée. Cependant, s'il n'y a pas de paramètres, vous pouvez passer null, comme décrit dans le document.
public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action) { if (obj.InvokeRequired) { obj.Invoke(action, null); } else { action(); } }
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!