Toute solution à Croix illégale exception de fonctionnement de cette discussion?

voix
15

Lorsque vous liez des données en C #, le fil qui change les données provoque le contrôle de changer aussi. Mais si ce thread est pas celui sur lequel le contrôle a été créé, vous obtenez une croix illégale fil exception de fonctionnement.

Est-il un moyen d'empêcher cela?

Créé 05/08/2008 à 08:45
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
3

Si la modification de données ne sont pas trop de temps (ce qui signifie, si le but principal du fil de fond n'est pas la modification des données réelles), essayez de déplacer la section qui modifie les données à un délégué et Invoke'ing ce délégué.

Si le travail est lourd réel sur les données, vous devrez probablement créer une copie profonde de ces données pour passer au fil d'arrière-plan, qui envoie les données traitées vers le thread d'interface utilisateur via Invoke à nouveau.

Vous ne devez déplacer le code qui modifie les données dans la fonction de délégué (parce que le changement de données est ce qui déclenche la mise à jour de contrôle). En dehors de cela, vous ne devriez pas avoir à écrire quelque chose de plus.

Créé 05/08/2008 à 09:05
source utilisateur

voix
3

Vous devriez être en mesure de faire quelque chose comme:

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

InvokeRequired est une propriété sur les contrôles pour voir si vous êtes sur le bon fil, puis Invoke invoquera le délégué sur le bon fil.

MISE À JOUR: En fait, mon dernier travail que 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 élimine la nécessité pour le bloc else et raffermit sorte de le code.

Créé 05/08/2008 à 08:51
source utilisateur

voix
1

Comme je n'ai pas un test pour aller de je ne peux pas garantir cette solution, mais il me semble qu'un scénario similaire à celui utilisé pour mettre à jour des 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 à faire par un fil particulier, puis laisser ce fil faire le travail!

Créé 05/08/2008 à 08:56
source utilisateur

voix
0

Dans WPF et Silverlight l'infrastructure de liaison prend en charge la commutation du thread d'interface utilisateur.

Créé 08/08/2008 à 17:19
source utilisateur

voix
0

Si l'appel de fil est « illégal » (c.-à l'appel DataBind concerne les contrôles qui ne sont pas créés dans le fil, il est appelé à partir), vous devez créer un délégué de sorte que même si la décision / préparation de la DataBind ne se fait pas dans le fil de création de contrôle, toute modification résultant d'entre eux (par exemple DataBind ()) sera.

Vous appelleriez mon code du thread de travail comme ceci:

this.BindData.Invoke();

Ce serait alors faire le fil d'origine pour faire la liaison, qui (en supposant qu'il est le fil qui a créé les contrôles) devrait fonctionner.

Créé 05/08/2008 à 09:06
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more