C#: l'interface graphique pour l'affichage en temps réel des messages de Service Windows
J'ai écrit en C# service windows qui peuvent écrire des messages à une coutume de Journal des événements ou à n'importe quel nombre de fichiers. Ces messages sont tous marqués par une certaine priorité (ainsi, par exemple, uniquement les Erreurs et les Avertissements sont enregistrées dans le Journal des événements, mais dans le cas contraire beaucoup plus peuvent être stockées dans un fichier).
Ce que je voudrais faire maintenant est de créer une interface graphique qui peut écouter ces messages et de les afficher en temps réel. Permettant à un utilisateur de regarder les messages actuels (quel que soit leur niveau de priorité), sans la nécessité de stocker le tout dans un fichier. Je suppose que c'est un programme distinct, avec une certaine forme de crochet dans le service, mais je n'en suis pas sûr où commencer.
C'est mon premier vrai service windows, donc j'ai l'impression de manquer de certains mots-clés pour trouver comment faire cela... existe-il des exemples de code, des tutoriels, des références, etc. pour savoir comment faire quelque chose comme cela?
Mise à JOUR
Beaucoup de réponses utiles, je l'aime quand il y a de nombreuses façons de résoudre un problème! Je pense que je vais mettre en œuvre une auto-hébergement WCF en fonction de la solution. Je suis toujours très clair sur les détails que je suis en train d'apprendre à propos de la WCF (je crois qu'il va se révéler très utile pour moi dans d'autres projets)... mais jusqu'à présent, j'ai trouvé les vidéos ici le plus utile comme intro comment.
Vous devez vous connecter pour publier un commentaire.
Ce que vous pouvez faire est d'avoir le service windows ont façon de s'inscrire à un événement (vous pouvez le faire par le biais de l'utilisation de Windows Communication Foundation). Lorsque votre erreur vient d'en haut, il déclenche l'événement, et votre application winforms en sera informé. Il est appelé un duplex de contrat:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/0eb69998-0388-4731-913e-fb205528d374/
http://msdn.microsoft.com/en-us/library/ms731184.aspx
En fait la chose vraiment cool, c'est que vous pouvez avoir de multiples applications à l'écoute de cette façon. De sorte que vous pouvez afficher sur l'écran, et avoir un autre journal d'application, etc. sans les deux les applications externes rien connaître les uns les autres.
Je sais que cela a déjà été mentionné, mais l'utilisation de Windows Communication Foundation (WCF). Plus précisément, le Publish-Subscribe Cadre développé par Juval Lowy, auteur de La programmation des Services WCF. Les détails sont décrits dans cet excellent article de MSDN, et le code source est disponible gratuitement à Lowy du site web.
La chose intéressante à propos de ce cadre est qu'il dissocie l'éditeur, par exemple, votre Windows, à partir des abonnés, par exemple, de votre interface. L'éditeur "publie" les événements qui sont d'intérêt pour la Pub/Sub Service, qui est toujours disponible. À partir de l'éditeur de point de vue, il n'a pas d'importance s'il y a des abonnés ou non. Le Pub/Sub Service de assure le routage des événements à tous et à tous les abonnés inscrits. De cette façon, votre Windows service publie les événements comme ils se produisent, votre GUI s'abonner/se désabonner à la Pub/Sub Service lors du chargement/sorties, et la Pub/Sub Service informera de votre interface selon les événements.
J'ai utilisé cette configuration dans mon projet, et il fonctionne très bien.
En fait, j'ai utilisé le BitFactory Enregistreur qui a une prise enregistreur que vous pouvez utiliser pour cela.
Ce que vous décrivez est la communication inter-processus, ce qui peut être gênant.
La méthode la plus simple et la plus élégante, mais probablement moins réactif, est d'avoir le service d'écrire des entrées comme des petits fichiers de texte (ou ajouter à un journal), et vous avez votre GUI utiliser un FileSystemWatcher pour détecter les nouveaux fichiers ou les mises à jour dans le fichier de log, et lire le fichier. Vous devez vous assurer que le service ouvre le fichier en ajout dans un "partage", qui permet un accès en lecture seule alors que c'est écrit. Sinon, vous allez bloquer un processus ou d'une autre, probablement à l'origine des messages perdus.
Les processus peuvent communiquer par l'intermédiaire de certains intégrés dans les canalisations. si votre service écrit des messages à ses StandardOutput pipe, l'interface utilisateur à distance peut attacher un écouteur et de recevoir des événements lorsque les messages sont écrits. C'est sans doute le plus élégant de non-fichier de façon à faire ce que vous voulez. La recherche la classe Process, en particulier la OutputDataReceived événement. Vous devrez aller chercher le processus à partir de votre interface en quelques information permettant une identification unique, à l'aide de GetProcess().
Vous avez besoin de regarder pour la "synchronisation" et "communication inter-processus". Dans votre cas, le service serait d'utiliser l'événement mondial ou sémaphore de la présence du signal de données, et GUI processus serait de vérifier événement/sémaphore de l'état et de lire les mises à jour à partir du journal des événements ou à partir d'un fichier.
Il existe des scénarios plus complexes, mais le dessus est un bon point de départ.
Modèle observateur!
Peut-être un délégué pour tous les modèles observables que vous pouvez brancher dans votre service?
.NET remoting sur IPC canal.