J'ai une winform avec un travail d'arrière-plan: première fois je cours cela ça marche bien. Mais la seconde fois, je reçois "Informations supplémentaires: Fonctionnement transversal non valide: Contrôle" UIPROGRESS "accessible depuis un fil autre que le fil qu'il a été créé." p>
BlockQuote> La chose étrange est sur la première fois que FOO in Démarrer () est un WindowsformsSyncronizeContext strong> mais sur le second, c'est un système System.Trireading.SyncronizationContext strong>. < / P> L'application que j'écris est un plugin Exceldna. p> edit p> start () est appelé comme ceci: p> InvalidOperationException code> lorsque vous appelez this.hide () code>. P>
6 Réponses :
Votre méthode de démarrage () doit être appelée em> à partir du code qui fonctionne sur le thread d'interface utilisateur pour permettre au travail d'arrière-plan de fonctionner correctement. Ce n'était pas quand vous obtenez cette exception. Ajoutez du code de protection à votre méthode afin que vous puissiez diagnostiquer cet incident: Vous pouvez désormais définir un point d'arrêt sur la déclaration de lancer et utiliser la fenêtre de pile d'appels du débogueur pour savoir pourquoi cela s'est passé. p> p>
Invoqué est toujours faux pour moi.
Cela signifie que l'objet uiprogress est créé sur le mauvais fil. Code mis à jour. Il est plus universel que posté mais vous obtiendrez une meilleure trace de pile lorsque vous avez mis le test dans votre constructeur.
Utilisez la méthode // http://msdn.microsoft.com/en-us/library/0b1bf3y3 (v = vs.110) .aspx p> begininvoke () code> sur le formulaire: private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.BeginInvoke(new InvokeDelegate(InvokeMethod));
}
public delegate void InvokeDelegate();
public void InvokeMethod()
{
this.Hide();
this.Dispose();
}
Vous appelez l'opération UI sur le fil d'arrière-plan. C'est la raison de cette exception. J'utiliserais une méthode tout à fait différente pour rendre le formulaire de progression le meilleur est d'utiliser la tâche avec Iprogress. L'une d'autre manière à utiliser ceci:
Je pense que vous pouvez trouver une aide d'aide ici: Worker Masquer la fenêtre de formulaire à la fin de l'achèvement a>.
Cependant, n'oubliez pas de détacher les événements du travail d'arrière-plan et arrêtez le travail d'arrière-plan que vous aimez vous expliquer ici: Bonne façon de disposer d'un travail d'arrière-plan .
Le problème peut être dans le dans l'événement code> Backworker_Runworkercompled code>. Avec cela, vous êtes disposé à la page de formulaire. Est-ce ce que vous voulez faire? Ou vous voulez disposer du travail d'arrêt? Élimination de la page de formulaire Toutes les ressources sont publiées, ce qui le fait Pour plus d'informations, vous pouvez voir ces liens: this.hide (); code> une seconde fois peut être une erreur. P>
Vous devez vérifier ce lien
Comment mettre à jour l'interface graphique d'un autre fil en C #? < / a> p>
a probablement toutes les réponses possibles p>
J'espère que cette aide p>
Vous exécutez un appel au fil principal d'un fil qui ne peut pas manipuler l'interface utilisateur. Le moyen le plus simple est d'utiliser une invocation de délégué anonyme.
Modifier ceci: p> pour ceci: p>
Comment
Démarrer code> est invoqué?@kennyzx j'ai mis à jour ma question
J'ai trouvé un ancien POST sur SyncronizationContext , la technique, vous pouvez enregistrer le
windowsformssyncronizationContext code> pour une utilisation ultérieure. Je ne sais pas comment il est basculé vers un autreSyncronizeContext code>, peut-être que l'environnement Excel-ANN ... prend du temps de débogage difficile.Identique à Kennyzx .. Voici un autre message - blogs. msdn.com/b/kaelr/archive/2007/09/05/... Je suppose que cela a quelque chose à voir avec la chose de l'ADN Excel (jamais utilisé ou même entendu parler de cela avant .. mais a l'air cool)
La meilleure option consiste à utiliser Begininvoke dans le rappel