2009-02-12 8 views
0

J'ai migré un héritage .Net projet .Net de .Net 1.1 pour .Net 3.5 et quand je tente de l'exécuter, je reçois l'erreur suivante:délégués après la migration projet .Net 1.1 à 3.5

Cross-thread operation not valid: Control 'grpLogin' accessed from a thread other than the thread it was created on.

Lorsque le thread a (ce que je suppose n'est pas le thread UI) modifie la propriété enabled d'un bouton à true.

Je pense que quelque chose a changé dans le cadre pour ajouter cette restriction, y a-t-il un moyen de faire ce travail sans avoir à revoir toute l'application?

Puis-je faire VS (j'utilise VS 2008) exécuter l'application comme .Net 1.1 (je ne suis même pas sûr que ce soit le problème)

L'application est simplement une application de test pour une API On m'a dit de faire de l'ingénierie inverse, et je n'ai pas vraiment la bande passante pour résoudre tous ses problèmes. Je sais que cela a fonctionné auparavant, mais je n'ai pas une ancienne version de VS installé, donc je devais le convertir vers VS 2008.

Répondre

0

trouvé solution Fix here est d'utiliser les délégués annonomous:

// running on worker thread... 
    string newText = LongRunningOperation(); 

    //switch to UI thread 
    this.Invoke((MethodInvoker)delegate { 
    // this bit runs on the UI thread 
    this.Text = newText; 
    }); 

Il est évident que remplacer "this.Text" avec le code que vous voulez exécuter dans le thread UI, fonctionne un charme.

Toujours intéressé par un moyen de fonctionner sous .Net 1.1 sous VS 2008 J'ai entendu dire que vous pouvez exécuter plusieurs versions de F/Work, mais vous ne savez pas comment.

J'ai commencé à ajouter les délégués annotés là où il y a du code d'interface utilisateur pour résoudre ce problème.

1

Le correctif est de ne pas utiliser des méthodes anonymes: il est juste d'utiliser Control.Invoke ou Control.BeginInvoke en quelque sorte . Peu importe qu'il s'agisse d'une méthode anonyme, d'un délégué créé à partir d'un groupe de méthodes ou d'une expression lambda - le point est que vous devez vous déplacer vers le thread d'interface utilisateur. Voir my threading article pour plus de détails. Vous pouvez également envisager d'utiliser BackgroundWorker pour le rendre plus facile. (Mon article a été écrit avant .NET 2.0, d'où son manque de références BackgroundWorker.)

C'était déjà un bug dans votre code 1.1, en passant - ce n'est pas une nouvelle restriction dans .NET 2.0, c'est juste que .NET 2.0 a ajouté une vérification (en lançant l'exception que vous avez vue) lors de l'exécution en mode débogage.

Questions connexes