none
In FileWatcher_OnChanged Event Timer.Enabled=True setzen RRS feed

  • Frage

  • Hallo zusammen,
    im Moment schlage ich mir egal wie rum ich mich drehe die Nase an.

    Kennt irgend jemand für mein Problem eine Lösung?

    Da es nicht möglich ist im Filewatcher-Event, die Datei auf deren Änderung des Inhalts geschaut wird, zu lesen, wollte ich im Filewatcher-Event einen Timer aktivieren, in dessen Event ich dann die Datei auslese.
    Das funktioniert aber irgendwie nicht, wenn Timer.enabled im FileWatcher Event gesetzt wird . Der Timer Event wird nicht ausgelösst. Der Timer-Event kommt, wenn ich enabled über einen Button setze, also grundsätzlich funktioniert es. Ich könnte die Struktur auch umbauen, sodass der Timer immer läuft, aber das möchte ich gerne vermeiden.

    Private Sub FileWatcher_OnChanged(source As Object, e As FileSystemEventArgs)
         WaitTimer.Enabled = True       
    End Sub

    Dim value As clsAnwZeit
    Private Sub WaitTimer_Tick(sender As Object, e As System.EventArgs) Handles WaitTimer.Tick
       WaitTimer.Enabled = False
       value = xmlLaden(_filePathPraesenzZeit)
       Console.WriteLine("Neuer Wert" & value.VonMinuten & " " & value.BisMinuten)
    End Sub

    Guss an Alle
    Peter


    • Bearbeitet peter haus Dienstag, 19. März 2013 07:05
    Dienstag, 19. März 2013 07:01

Antworten

  • Hallo Peter,

    ein FSW verschickt seine Ereignisse über einen Hintergrund-Thread, dort sind Zugriffe auf Windows Forms Timer nicht zulässig.

    Deswegen verwende einen System.Threading.Timer oder System.Timers.Timer. Die sind davon nicht betroffen, und lösen das Ereignis auch auf einem Hintergrundthread aus.

    Mehr siehe Zeitgeber.

    Gruß Elmar

    • Als Antwort markiert peter haus Dienstag, 19. März 2013 12:17
    Dienstag, 19. März 2013 07:12
    Beantworter

Alle Antworten

  • Hallo Peter,

    ein FSW verschickt seine Ereignisse über einen Hintergrund-Thread, dort sind Zugriffe auf Windows Forms Timer nicht zulässig.

    Deswegen verwende einen System.Threading.Timer oder System.Timers.Timer. Die sind davon nicht betroffen, und lösen das Ereignis auch auf einem Hintergrundthread aus.

    Mehr siehe Zeitgeber.

    Gruß Elmar

    • Als Antwort markiert peter haus Dienstag, 19. März 2013 12:17
    Dienstag, 19. März 2013 07:12
    Beantworter
  • Hi Peter, hi Elmar.

    Rein theoretisch müsste Peter doch, wenn er vom FWS ein Invoke startet in den Main-Thread und dort dann (so wie sonst auch) lokal den Timer startet, auch das gewünschte Ergebnis erhalten, oder?

    Schwierig wird es doch nur, weil der FSW in einem anderen Thread läuft als die Hauptform und threadübergreifend der Zugriff nicht funktioniert.

    Oder würde es selbst dann nicht klappen? (Habe so ein Konstrukt leider trotz vieler Timer und FSWs noch nicht selbst ausprobiert. :-)

    LG, Dennis.

    Dienstag, 19. März 2013 08:40
  • Hallo Elmar,

    wieder mal Dank für deine Antwort.
    Jetzt kam es mir auch wieder, ich hatte das Problem schon mal.
    Wenn es dir keine Umstände macht. Kannst du mir sagen, ob ich das gleiche (Wert übergeben und "Event" Änderungsmeldung erhalten) auch mit "async named pipes" umsetzen kann?
    http://www.codeproject.com/Tips/441841/Csharp-Named-Pipes-with-Async
    http://www.codeproject.com/Tips/492231/Csharp-Async-Named-Pipes

    Grüsse Peter

    Dienstag, 19. März 2013 09:55
  • Hi,

    ich habe es mit async named pipes verucht und es funktioniert.

    Gruss Peter

    Dienstag, 19. März 2013 12:17