C#: GUI zur Anzeige von Echtzeit-Nachrichten aus Windows-Dienst
Ich geschrieben habe eine C# windows-Dienst kann Nachrichten schreiben, um ein benutzerdefiniertes Ereignisprotokoll oder eine beliebige Anzahl von Dateien. Diese Nachrichten sind alle markiert mit Priorität (also z.B. nur Fehler und Warnungen gespeichert im EventLog, aber wenn gewünscht viel mehr können gespeichert werden in einer Datei).
Was ich jetzt tun möchte ist, erstellen Sie ein GUI, das Zuhören kann für diese Nachrichten und zeigt Sie in Echtzeit. Einem Benutzer erlauben, sehen Sie hier die aktuellen Nachrichten (was auch immer Sie für Ihre gewünschte Priorität), ohne die Notwendigkeit, um alles zu speichern in eine Datei. Ich nehme an, dies ist ein separates Programm, mit irgendeiner form von Haken in den Dienst, aber ich bin mir nicht sicher, wo zu beginnen.
Dies ist meine erste echte windows-Dienst, so dass ich scheinen zu fehlen einige Schlüsselwörter, um herauszufinden, wie dies zu tun... gibt es irgendwelche code-Beispiele, tutorials, Referenzen, usw. wie Sie so etwas tun?
UPDATE
Eine Menge hilfreiche Antworten, ich Liebe es, wenn es gibt viele Möglichkeiten, um ein problem zu lösen! Ich denke, ich werde implementieren Sie eine self-hosting von WCF-basierten Lösung. Ich bin immer noch sehr Licht auf die details, wie ich versucht bin, erfahren Sie mehr über WCF (ich glaube, es wird beweisen, sehr nützlich für mich in anderen Projekten)... aber bisher fand ich die videos hier zu sein, die hilfreich sind, wie ein intro wie.
InformationsquelleAutor chezy525 | 2010-11-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie tun können, ist die windows-Dienst-haben die Möglichkeit der Registrierung für eine Veranstaltung (Sie können dies durch Verwendung der Windows Communication Foundation). Wenn Ihr Fehler kommt, feuert das Ereignis, und Ihre winforms-app benachrichtigt werden. Das nennt man duplex-Vertrag:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/0eb69998-0388-4731-913e-fb205528d374/
http://msdn.microsoft.com/en-us/library/ms731184.aspx
Eigentlich die wirklich Coole Sache ist, dass Sie können mehrere Anwendungen haben hören auch auf diese Weise. So können Sie es auch anzeigen auf dem Bildschirm, und haben Sie eine andere Anwendung Protokoll etc. ohne die beiden externen apps wissen nichts über einander.
InformationsquelleAutor kemiller2002
Ich weiß, das wurde schon erwähnt -, aber die Windows Communication Foundation (WCF). Verwenden Sie insbesondere die Publish-Subscribe-Framework entwickelt von Juval LÖWY, Autor von Programming WCF Services. Die details sind beschrieben in diese ausgezeichnete MSDN-Artikel, und der Quellcode ist kostenlos erhältlich im LÖWY ' s website.
Das schöne an diesem Rahmen ist, dass es entkoppelt die publisher, z.B., Windows-Dienst, von jedem Teilnehmer, z.B., deine GUI. Der Verlag "veröffentlicht" Ereignisse, die von Interesse für die Pub/Sub-Service, der immer verfügbar ist. Aus publisher-Sicht ist es egal, ob es Abonnenten oder nicht. Die Pub/Sub-Service kümmert sich um das routing von Ereignissen und allen registrierten Abonnenten. Auf diese Weise wird Ihr Windows-Dienst veröffentlicht die Ereignisse, wie Sie auftreten, Ihre GUI abonnieren/abbestellen der Pub/Sub-Service, wenn es lädt/beendet, und der Pub/Sub-Service benachrichtigt Ihre GUI, wie die Ereignisse auftreten.
Habe ich dieses setup in meinem Projekt, und es funktioniert sehr gut.
InformationsquelleAutor Matt Davis
Habe ich doch tatsächlich die BitFactory Logger, dass eine socket-logger, die Sie für diesen Zweck verwenden können.
InformationsquelleAutor kd7
Was du beschreibst ist die inter-Prozess-Kommunikation, die sich chaotisch.
Die einfachste und eleganteste, aber wohl am wenigsten reaktiv ist, den service schreiben, die Einträge als kleine text-Dateien (oder "anfügen", um eine log), und haben Ihre GUI verwenden Sie einen FileSystemWatcher, um zu erkennen neuer Dateien oder updates für die log-Datei, und Lesen der Datei. Sie haben, um sicherzustellen, dass der Dienst öffnet die Datei zum Anhängen in einem "shared" - Weise, so dass nur-lese-Zugriff, während Sie es schreiben. Andernfalls werden Sie blockieren einen Prozess oder die andere, wahrscheinlich verursacht verlorenen Nachrichten.
Prozesse kommunizieren über einige eingebaute Rohrleitungen. wenn Ihr service schreibt Nachrichten an seine StandardOutput-Rohr, die GUI Remote attach listener und events erhalten, wenn Nachrichten geschrieben werden. Dies ist wohl die eleganteste non-Datei Weg, das zu tun, was Sie wollen. Forschung der Prozess Klasse, vor allem die OutputDataReceived Veranstaltung. Sie müssen gehen sehen, die für den Prozess aus Ihrer GUI von einigen eindeutig identifizierende Informationen, mit GetProcess().
Die Datei-Methode war eigentlich eine Idee würde ich zwar, aber konnte Sie nicht finden, eine saubere Art und Weise, es zu tun. Die FileSystemWatcher-sieht aus wie eine sehr gute Lösung! Ich glaube nicht, dass die Rohre bieten eine saubere Lösung für mich... Wenn ich das richtig verstehe, wird der Dienst wissen müssen über die GUI (umleiten es ist StandardOutput) am Start, die ich bin nicht sicher, es wird... Ist das richtig, oder bin ich etwas fehlt?
Nicht, wenn Sie named pipes verwenden. Erstellen Sie ein Rohr mit einem Global eindeutigen Namen (in der Regel so etwas wie "\\.\pipe\Firmenname\Anwendungsname\Pipe-Name"). Der service schafft die pipe, wenn es beginnt, und die GUI-app verbinden zu können, dass eine pipe mit Namen.
InformationsquelleAutor KeithS
Sie brauchen, um für die "Synchronisation" und "inter-Prozess-Kommunikation". In deinem Fall den Dienst verwenden würden, die Globale Veranstaltung oder semaphore, signal-Präsenz von Daten und GUI-Prozess würde überprüfen Sie die Ereignis - /semaphor-Zustand und Lesen Sie die updates aus der Ereignisanzeige oder aus Datei.
Gibt es mehr komplizierte Szenarien, aber die oben ist ein guter Ausgangspunkt.
InformationsquelleAutor Eugene Mayevski 'Allied Bits
Observer-Muster!
Vielleicht ein Delegierter für alle beobachtbaren Modelle, können Sie Haken in Ihrem Dienst?
InformationsquelleAutor Jake Kalstad
.NET remoting über IPC-Kanal.
InformationsquelleAutor leppie