Une solution à l'exception Illegal Cross Thread Operation ?

Lorsque vous liez des données en C

请先 登录 后评论

4 réponses

Mike Stone

Vous devriez pouvoir faire quelque chose comme :

if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}

InvokeRequired est une propriété sur Controls pour voir si vous êtes sur le bon thread, puis Invoke invoquera le délégué sur le bon thread.

MISE À JOUR : En fait, lors de mon dernier travail, nous avons fait quelque chose comme ceci :

private void SomeEventHandler(Object someParam)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
    }

    // Regular handling code
}

ce qui supprime le besoin du bloc else et resserre en quelque sorte le code.

请先 登录 后评论
tags2k

Comme je n'ai pas de cas de test, je ne peux pas garantir cette solution, mais il me semble qu'un scénario similaire à celui utilisé pour mettre à jour les barres de progression dans différents threads (utiliser un délégué) serait approprié ici.

public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);

public void DoDataBind()
{
    DataBind();
}

Si la liaison de données doit être effectuée par un thread particulier, laissez ce thread faire le travail !

请先 登录 后评论
Ishmaeel

Si la modification des données ne prend pas trop de temps (c'est-à-dire si l'objectif principal du thread d'arrière-plan n'est pas la modification réelle des données), essayez de déplacer la section qui modifie les données vers un délégué et d'invoquer ce délégué.< /p>

Si le gros travail réel concerne les données, vous devrez probablement créer une copie complète de ces données à transmettre au thread d'arrière-plan, qui renverra les données traitées au thread d'interface utilisateur via Invoke à nouveau.

Vous n'aurez qu'à déplacer le code qui modifie les données dans la fonction déléguée (car la modification des données est ce qui déclenche la mise à jour du contrôle). En dehors de cela, vous ne devriez rien avoir à écrire de plus.

请先 登录 后评论
Brian Leahy

Dans WPF et Silverlight, l'infrastructure de liaison s'occupe du passage au thread d'interface utilisateur.

请先 登录 后评论
  • 26 abonnés
  • 0 favoris,316 Feuilleter
  • gil posée à 2023-03-03 13:04