Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Textdatei auf Änderungen überwachen (möglichst in "realtime")
yngwie
myCSharp.de - Member



Dabei seit:
Beiträge: 238

Themenstarter:

Textdatei auf Änderungen überwachen (möglichst in "realtime")

beantworten | zitieren | melden

Hallo,

folgendes Problem gilt es zu lösen:

- Application A schreibt sporadisch Meldungen in eine Textdatei
- Application B (anderer Prozess) liesst aus dieser Textdatei und zeigt den Inhalt in ihrer Textbox an
- Wie kann Application B möglichst zeitnah merken dass der Inhalt der Textdatei verändert wurde?

Momentan probiere ich dass sich B über einen FilesystemWatcher updatet - wenn allerdings A anfängt die Meldungen sehr oft auszuspucken dann kommt der FilesystemWatcher mit seien Events nicht mehr hinterher und die TextBox aktualisiert sich mit grösserer Verzögerung. Mir ist klar dass bei dieser Geschwindigkeit kein Mensch die TextBox mitlesen kann; dennoch -> kennt vielleicht jemand andere/performatere Ansätze wie B Änderungen an dieser Textdatei mitkriegen kann?

Danke
private Nachricht | Beiträge des Benutzers
Marsti
myCSharp.de - Member



Dabei seit:
Beiträge: 120

beantworten | zitieren | melden

Liegt die andere Anwendung auch in deinen Händen? Dann könnte diese eine Meldung an die auslesende Anwendung schicken.
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1.433
Herkunft: Schweiz

beantworten | zitieren | melden

Zitat
Wie kann Application B möglichst zeitnah merken dass der Inhalt der Textdatei verändert wurde?
Wie wäre es mit einem Timer der alle 5 Sekunden die Textdatei auf ihre Grösse überprüft. Wenn diese grösser ist als beim letzten Check, dann schreibt er den Inhalt in die besagte Textbox.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
private Nachricht | Beiträge des Benutzers
Kao
myCSharp.de - Member



Dabei seit:
Beiträge: 34
Herkunft: Dresden

beantworten | zitieren | melden

Oder versuchs mal mit nem FileSystemWatcher

Kleines schnelles Beispiel gibts hier -> http://www.java2s.com/Code/CSharp/File-Stream/SetNotifyFilterofFileSystemWatcher.htm

Mehr Infos zum Gebrauch liefert dir die Msdn-Doku.

Grüße
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
Wie wäre es mit einem Timer der alle 5 Sekunden die Textdatei auf ihre Grösse überprüft. Wenn diese grösser ist als beim letzten Check, dann schreibt er den Inhalt in die besagte Textbox.

so bitte nciht... dafür gibt es den besagten filesystemwatcher....
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1.433
Herkunft: Schweiz

beantworten | zitieren | melden

Zitat von JAck30lena
Zitat
Wie wäre es mit einem Timer der alle 5 Sekunden die Textdatei auf ihre Grösse überprüft. Wenn diese grösser ist als beim letzten Check, dann schreibt er den Inhalt in die besagte Textbox.

so bitte nciht... dafür gibt es den besagten filesystemwatcher....
Kann muss aber nicht, auch eine Lösung sein. Best Practices natürlich ausgeschlossen.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

klar.. man kann auch per reflection.emit code einschleusen, das eine native dll generiert und compaliert, welche dann automatisch gestartet wirt, welches dann einen dienst erzeugt und registriert, welches dann alle 50 ms auf den ordner geht und die datei pollt um dann per remoting der ursprünglichen anwendung eine message zu schicken, damit diese weiß das sich etwas geändert hat.

-->
Zitat
Kann muss aber nicht, auch eine Lösung sein. Best Practices natürlich ausgeschlossen.

deswegen würde ich es dennoch nciht machen.. nur weil es eine lösung ist. solchen gedankengut begegne ich in meinem jetzigen projekt leider vieeeel zu oft.... ;-)
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1.688

beantworten | zitieren | melden

Zitat von yngwie
Momentan probiere ich dass sich B über einen FilesystemWatcher updatet - wenn allerdings A anfängt die Meldungen sehr oft auszuspucken dann kommt der FilesystemWatcher mit seien Events nicht mehr hinterher und die TextBox aktualisiert sich mit grösserer Verzögerung.

Wie wäre es, ein paar Events zu "sammeln"? Beim Auftreten eines Events wird ein Timer (neu) gestartet und wenn über 1-2 s keine Ereignisse mehr kommen (oder eben spätestens nach 2 s oder auch nach einer festgelegten Anzahl von Ereignissen) werden die Meldungen angezeigt.
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
und die TextBox aktualisiert sich mit grösserer Verzögerung

das allerdings liegt höchst wahrscheinlich nciht am filesystemwatcher sondern an deiner art der stringverkettung. siehe: [Artikel] Performant Strings verketten
yngwie
myCSharp.de - Member



Dabei seit:
Beiträge: 238

Themenstarter:

beantworten | zitieren | melden

Hallo Marsti,

ja beide Anwendungen sind von mir. Wie genau kann Anwendung A eine Nachricht an B schicken (wenigstens ein Stichwort) und wie schnell ist so etwas?
private Nachricht | Beiträge des Benutzers
yngwie
myCSharp.de - Member



Dabei seit:
Beiträge: 238

Themenstarter:

beantworten | zitieren | melden

Zitat von Kao
Oder versuchs mal mit nem FileSystemWatcher

Sorry aber du hast mein Post nicht (aufmerksam) gelesen - ich verwende bereits einen FileSystemWatcher :(
private Nachricht | Beiträge des Benutzers
yngwie
myCSharp.de - Member



Dabei seit:
Beiträge: 238

Themenstarter:

beantworten | zitieren | melden

Das:
Zitat von JAck30lena
klar.. man kann auch per reflection.emit code einschleusen, das eine native dll generiert und compaliert, welche dann automatisch gestartet wirt, welches dann einen dienst erzeugt und registriert, welches dann alle 50 ms auf den ordner geht und die datei pollt um dann per remoting der ursprünglichen anwendung eine message zu schicken, damit diese weiß das sich etwas geändert hat.
ist eine sehr interessante Idee :)

und das:
Zitat von JAck30lena
das allerdings liegt höchst wahrscheinlich nciht am filesystemwatcher sondern an deiner art der stringverkettung.
eine gewagte Annahme :D

Übrigens, die Verzögerung scheint durch die Bufferung des in A verwendenten TraceWriters zu entstehen - behoben durch das regelmäßige Aufrufen von Flush() :P
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von yngwie am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo yngwie,

wenn beide Anwendungen von dir sind, warum benutzt du dann eine Datei zur Kommunikation? Du könntest die Daten doch auch direkt von einer Anwendung zur anderen senden.

Aber wieder auch sei. Das Stichwort ist in beiden Fällen Interprozesskommunikation (IPC), egal ob du die Daten sendest oder nur die Mitteilung, dass neue Daten vorhanden sind.

herbivore
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
eine gewagte Annahme :D

jain. ist eines der häufigsten fehlern bei der programmierung mit .net. ich habe einfach eine symptim mit der statischten häufung von fehlprogrammierung kombiniert.

wie dem auch sei... ich habe richtig vermutet, das es nciht am filesystemwatcher liegt :-)

remoting ist ein etwas spezifischeres stichwort ;-)