2013-04-18 3 views
2

J'ai une application de console pour le moment, qui surveille un dossier pour les fichiers, puis, en fonction des règles et du nom de fichier, copie tout nouveau fichier à un emplacement sur le réseau. J'ai besoin de rendre l'application plus jolie, donc j'ai décidé d'aller avec une simple application WinForms simple formulaire qui affiche l'état et les informations de type 'dernier fichier mis à jour'.Winforms and Background Worker

L'application de la console a été écrite de telle manière que toutes les informations d'affichage de la console soient passées par une seule méthode, que j'ai appelée 'Notify', en prenant deux paramètres. Une chaîne pour afficher les informations que l'utilisateur doit voir, et une énumération ErrorLevel, qui, si "Normal" est affiché en vert, si Warning, est en jaune, et en cas d'erreur, en rouge. Mais le fait est que tout ce que mon code faisait était d'utiliser la méthode 'Notify' pour sortir n'importe quel texte. Je souhaite transformer mon application de console en une classe normale, l'exécuter en tant qu'opérateur d'arrière-plan à partir du projet WinForms et avoir la méthode Notify dans l'application d'envoi de threads à l'application winforms, en toute sécurité. Je pense que cela peut être fait avec des événements, mais je ne suis pas sûr de ce qui serait la meilleure façon de gérer cela. Pourriez-vous proposer une méthode pour que cela fonctionne?

Il y a la façon de faire 'Invoke'. Est-ce bien? Quelque chose comme:

this.BeginInvoke (new MethodInvoker(() => UpdateLabel(s)); 

Il semble que ce serait basique, mais je voudrais encore faire usage de mon Notifier méthode et ont qui envoient des messages à la couche d'interface utilisateur.

J'ai également besoin de l'application console pour envoyer des messages au thread. Par exemple, 'Stop', où j'exécute ensuite du code qui quitte le thread avec élégance ... et aussi 'Refresh', qui fait de la logique dans le thread.

Une autre option consiste à exécuter la classe de traitement en tant que service? Et puis avoir une interface utilisateur qui se connecte en quelque sorte au service du système et obtient des mises à jour? Je ne l'ai jamais fait quelque chose comme ça, mais le processus est censé fonctionner tout le temps ...

En ce moment, j'ai mon code en cours d'exécution, mais pas mis à jour l'interface utilisateur:

public partial class MainForm : Form 
{ 
    BackgroundWorker _bw = new BackgroundWorker(); 
    public MainForm() 
    { 
     InitializeComponent(); 
    } 

    private void MainForm_Load(object sender, EventArgs e) 
    { 

     _bw.DoWork += bw_DoWork; 
     _bw.RunWorkerAsync(); 
    } 

    private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     var bw = sender as BackgroundWorker; 
     var monitor = new Monitor(); 
     monitor.RunMe(); 

    } 
} 

I pense que je dois juste trouver un moyen d'obtenir ma méthode Notify dans mon thread pour envoyer un message ou quelque chose (Un objet que je crée, avec les propriétés Message String et ErrorCode?) Retour à mon interface utilisateur, et le traiter en toute sécurité sur l'interface utilisateur.

Et voici le code dans la classe (fil) ...

public class Monitor 
    { 
     public void RunMe() 
     { 
      Notify("Checking for network connectivity...", Constants.ErrorLevel.Information); 
      if (FileManagement.FolderExists(Constants.FolderToMonitor) == false) 
      { 
       Notify("Unable to monitor folder - Aborting.", Constants.ErrorLevel.Error); 
       Console.ReadKey(); 
       return; 
      } 
      Notify("OK", Constants.ErrorLevel.Information); 
.... 
} 

Note: readkey sera supprimé ..

+0

Vous souhaitez réellement utiliser la classe BackgroundWorker. Il a été conçu à cet effet. Voir http://msdn.microsoft.com/en-us//library/system.componentmodel.backgroundworker.aspx – Craig

+0

Merci, Craig. J'essaie cela maintenant, et ma classe exécute le code, mais j'ai besoin d'un moyen d'obtenir ma méthode Notify pour mettre à jour l'interface utilisateur appelant. – Craig

+0

Veuillez inclure un peu de ce que 'Notify' fait dans la version de la console. –

Répondre

1

Il peut y avoir une meilleure approche, mais si votre Notifier méthode a besoin Pour interagir avec l'interface graphique, essayez d'utiliser l'événement ReportProgress sur BackgroundWorker. Vous pouvez passer un objet en tant que paramètre d'état et probablement ignorer simplement la valeur de progression.