2010-11-27 17 views
1

J'ai une application WPF avec un hôte personnalisé powershell qui exécute un script stocké dans une ressource intégrée. Après le chargement, l'utilisateur clique sur le bouton Exécuter et le script est appelé, mais je vois l'erreur suivante:Thread WPF et hôte Powershell personnalisé - L'exécution de la commande a été interrompue car l'utilisateur a interrompu la commande.

exécution de commandes arrêté parce que l'utilisateur a interrompu la commande

L'utilisateur (c.-à-moi) n'a rien fait pour interrompre le script, donc je devine que c'est une sorte de problème de threading.

L'application accepte également un paramètre de ligne de commande qui indique au script de s'exécuter immédiatement. Quand j'ai ajouté cette fonctionnalité, le script a couru parfaitement, mais je na pas voir l'interface WPF jusqu'à ce que cela a été terminé donc j'ajouté ce qui suit à la mise en service du modèle de la vue principale de la fenêtre:

 var bgWork = new BackgroundWorker(); 
     bgWork.DoWork += (s,e) => { }; 
     bgWork.RunWorkerCompleted += (s,a) => 
     { 
      var app = (Application.Current as App); 

      if (app.ExecuteImmediate && StartCommand.CanExecute(null)) 
       StartCommand.Execute(null); 

     }; 
     bgWork.RunWorkerAsync(); 

Le BackgroundWorker exécute les Terminé code sur le thread UI. C'est juste une petite astuce que j'utilise assez souvent et ça marche plutôt bien.

Donc, une longue question que je connais, mais quelqu'un a-t-il des idées sur ce que je fais de mal?

En tant que problème secondaire ou connexe, j'ai également des problèmes de mise à jour de l'interface utilisateur via la liaison de données lors de l'exécution d'un processus. Par exemple, j'ai un indicateur d'état dans la barre d'état qui permute entre IDLE et BUSY mais cela ne semble jamais changer jusqu'à ce qu'il soit trop tard. La liaison fonctionne correctement mais c'est comme si j'avais besoin de l'ancien VB DoEvents() pour être appelé.

Vive

Répondre

0

ont résolu ce après un café et quelques minutes de débogage.

Il y avait une erreur parce que je n'avais pas implémenté complètement la méthode PromptForChoice.

Cependant, j'ai toujours des problèmes avec la mise à jour des liaisons.