6
votes

Backworker: InvalidOrationException en pancarborescompé

J'ai une winform avec un travail d'arrière-plan: xxx

première fois je cours cela ça marche bien. Mais la seconde fois, je reçois InvalidOperationException lorsque vous appelez this.hide () .

"Informations supplémentaires: Fonctionnement transversal non valide: Contrôle" UIPROGRESS "accessible depuis un fil autre que le fil qu'il a été créé."

La chose étrange est sur la première fois que FOO in Démarrer () est un WindowsformsSyncronizeContext mais sur le second, c'est un système System.Trireading.SyncronizationContext . < / P>

L'application que j'écris est un plugin Exceldna.

edit

start () est appelé comme ceci: xxx


5 commentaires

Comment Démarrer est invoqué?


@kennyzx j'ai mis à jour ma question


J'ai trouvé un ancien POST sur SyncronizationContext , la technique, vous pouvez enregistrer le windowsformssyncronizationContext pour une utilisation ultérieure. Je ne sais pas comment il est basculé vers un autre SyncronizeContext , 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


6 Réponses :


7
votes

Votre méthode de démarrage () doit être appelée à 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: xxx

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é.


2 commentaires

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.



1
votes

Utilisez la méthode begininvoke () code> sur le formulaire:

// http://msdn.microsoft.com/en-us/library/0b1bf3y3 (v = vs.110) .aspx p>

    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.BeginInvoke(new InvokeDelegate(InvokeMethod));               
    }

    public delegate void InvokeDelegate();

    public void InvokeMethod()
    {
        this.Hide(); 
        this.Dispose();
    }


0 commentaires

3
votes

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: xxx


0 commentaires

1
votes

Je pense que vous pouvez trouver une aide d'aide ici: Worker Masquer la fenêtre de formulaire à la fin de l'achèvement . 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 xxx

dans l'événement Backworker_Runworkercompled . 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 this.hide (); une seconde fois peut être une erreur.

Pour plus d'informations, vous pouvez voir ces liens: c # form.close vs forme.Dispose et Form.Dispose méthode


0 commentaires


1
votes

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: xxx

pour ceci: xxx c'est pas la voie la plus optimisée, mais le travail est-il impressionnellement rapidement sans beaucoup de recoder. :)


0 commentaires