2010-06-21 10 views
2

J'ai une petite application qu'un client utilise pour mettre à jour manuellement certaines données. C'est très basique; Au chargement, il remplit une liste d'entreprises que l'utilisateur peut sélectionner et clique sur un bouton pour mettre à jour les données dans un autre système. Le client veut être capable d'exécuter cette même fonctionnalité à partir de la ligne de commande, j'ai donc ajouté un worker de fond. Lorsque l'application est lancée, je vérifie un argument spécifique et si je le trouve, je lance le travailleur. Une fois le travail terminé, j'appelle Close();L'application Winform ne se ferme pas

Tout semble fonctionner correctement (les données sont mises à jour comme prévu et l'application semble se fermer), mais lorsque je vérifie le gestionnaire de tâches, l'application est toujours en cours d'exécution.

Mes questions:

  1. Quelle chose/choses dois-je être à la recherche pour trouver la cause de l'application toujours en cours?
  2. Y a-t-il une meilleure façon de faire cela?

Voici un échantillon du code:

public MainForm() 
     { 
      InitializeComponent(); 

      var args = Environment.GetCommandLineArgs(); 
      Array.ForEach(args, x => x.ToLower()); 

      if (args.Contains("u")) 
       backgroundWorker.RunWorkerAsync(); 

     } 
private void BackgroundWorkerDoWork(object sender, System.ComponentModel.DoWorkEventArgs e) 
     { 
      //call to web service to update data 
     } 

private void BackgroundWorkerRunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) 
     { 
      Close(); 
     } 
+0

Quel est le code dans votre fichier Program.cs? –

+0

Le code dans Program.cs est la valeur par défaut. Je n'avais pas modifié cela. – Chuck

+1

Je présume Application.Run() dans Program.cs n'a pas quitté, si c'est le cas, alors quelque chose garde le message de pompage sur le thread en cours d'exécution - probablement quelque chose sur le formulaire. –

Répondre

3

2) Existe-t-il une meilleure façon de procéder?

Vous pouvez exécuter le code à partir d'une application Console et être sûr que vous n'avez aucun problème WinForms/Threading. En variante, vous pouvez vérifier directement la ligne de commande dans Main() et même ne pas exécuter Application.Run (mainForm).

+0

Je suis refactoring pour faire exactement cela maintenant. Je devrais être fait dans une minute. – Chuck

+0

J'aime beaucoup mieux cette solution que ce que je faisais! Je vous remercie! – Chuck

0

Plutôt que d'appeler Close(), essayez d'appeler Application.Exit(). Cela mettra fin à l'application plutôt que de simplement fermer le formulaire.

+0

J'ai essayé cela. L'application est toujours présente dans le gestionnaire de tâches. – Chuck

0

L'arrière-plan est dans un autre thread que le thread UI.

Créez un délégué pour la gestion des tâches (en l'occurrence, dans ce cas) dans le thread d'interface utilisateur. Example here

+1

Pas tout à fait correct. Les événements BackgroundWorker sont ramenés sur le thread de l'interface utilisateur - il est le formulaire Close() dans l'événement BackgroundWorker. –

+0

Hmm, maintenant vous le mentionnez .. –

Questions connexes