Announcement

Collapse
No announcement yet.

Timer wiederholt sich nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Timer wiederholt sich nicht

    Hallo zusammen.

    Ich schreibe einen Service. In der Start-Prozedur erzeuge ich einen Timer:

    [highlight=vbnet]
    Dim oCallBackPersons As New TimerCallback(AddressOf TimedEventPersons)
    Dim oTimerPersons As New System.Threading.Timer(oCallBackPersons, Nothing, 1000, 10000) [/highlight]

    Dieser sollte eine Sekunde nach Start des Service starten und dann alle 10 Sekunden wiederholt werden. Da klappt aber soweit ganz gut.
    ABER: In diesem Timer rufe ich eine Prozedur auf. Diese läuft bis zum Ende erfolgreich durch. Aber irgendwas in der Prozedur führt dazu, dass der Timmer sich nicht wiederholt. Der Service stürzt nicht ab oder so (das würde ich in log.dateien sehen da ich alles mit Exceptions abfange).
    Nun habe ich folgendes gemacht: ich habe die ganze Prozedur auskommentiert und jede zeile von oben beginnen wieder ein kommentiert und geschaut bis wo sich der Timer immer brav wiederholt.

    Hier erstmal der Code des Timers:
    [highlight=vbnet]
    Sub TimedEventPersons()
    Try
    WriteLog("ExportPersons: Start")
    Call ExportPersons()

    Catch ex As Exception
    WriteLog(ex.Message)
    End Try

    End Sub
    [/highlight]

    So, ich poste jetzt den Code der Prozedur bis zu der Zeile wo offensichtlich ein Fehler passiert:
    [highlight=vbnet]
    Public Sub ExportPersons()
    Dim querystring As String = ""
    Dim connectionString As String = GetConnectionString()
    WriteLog(connectionString)

    Try
    Using connection As New SqlConnection
    If SQLIntegratedSecurity = True Then
    WriteLog("Öffne Connection zu Server: " & SQLServer & " Instanz: " & SQLInstanz & " mit Windows Authentifizierung")
    Else
    WriteLog("Öffne Connection zu Server: " & SQLServer & " Instanz: " & SQLInstanz & _
    " mit SQL-User: " & SQLUser)
    End If

    connection.ConnectionString = connectionString
    connection.Open()

    querystring = "SELECT p.* FROM Tabelle1 p"
    Dim daResult As SqlDataAdapter = New SqlDataAdapter(querystring, connection)
    Dim dsResult As DataSet = New DataSet
    daResult.Fill(dsResult, "Tabelle1")
    [/highlight]

    Solange die Zeile "Dim dsResult As DataSet = New DataSet
    daResult.Fill(dsResult, "hPerson")" auskommentiert ist läuft der Timer alle 10 Sekunden. Sobald ich diese einkommentiere läuft er einmal durch und macht dann nichts mehr bis ich den Service beende.

    In der OnStop Prozedur schreibe ich wieder was in ein Log. Das klappt wunderbar. Daher nehme ich an dass der Service nicht abstürzt. Ich habe aber auch keine Ahnung was da los sein kann! Ich bin echt hilflos!

    Habt ihr eine Idee?

    LG
    Michael
    Zuletzt editiert von mwarlich; 13.05.2011, 11:19.

  • #2
    Deine oTimerPersons Variable ist eine lokale Variable deiner Start Prozedur und keine Klassenvariable? Das wäre schlecht.

    OnStart läuft zu Ende die lokale Variablen werden zerstört und der Timer wird nicht mehr referenziert. Irgendwann wenn dann der GC sich mal zum aufräumen bemüht wäre es dann spätestens vorbei mit dem Timern Auch wenn dein Timer noch aktiv ist das ist dem GC egal der guckt nur ob der noch referenziert ist. Dein daResult.Fill sorgt vielleicht dadurch das er ein größeres Objekt im Speicher erzeugt, eben den Inhalt der DataTable, das ein GC lauf angestoßen wird. Im Falle ohne daResult.Fill würde es da einfach nur länger dauern bis es vorbei ist mit Timern

    Comment


    • #3
      Hallo Ralf

      danke für deine rasche Antwort!

      Erste Frage: was ist ein/der/das GC?

      Was ist die Lösung?
      Wenn ich dich richtig verstehe muss ich aus den TimerVariablen eine Klassenvariable machen? (also direkt nach "Public Class xxx)?

      LG
      Michael

      Comment


      • #4
        Erste Frage: was ist ein/der/das GC?
        GC = Garbage Collector.

        Ist derjenige der alle nicht mehr referenzierten Objekte irgendwann zerstört wenn er es denn für nötig hält.

        Was ist die Lösung?
        Die Variablendefinition 'Dim oTimerPersons' musst du aus der Methode direkt in die Klassendefinition verschieben. Den Timer kannst du ruhig weiterhin in OnStart erzeugen nur die Variable muss wie gesagt in die Klassendefinition damit die Lebenszeit der Variablen an die Lebenszeit der Klasse gekoppelt ist und nicht nur über die Aufrufdauer der OnStart Prozedur existiert.

        Comment


        • #5
          Ralf ich sage dir ein herzlichen Danke für deine nette Hilfe!

          LG
          Michael

          Comment


          • #6
            Mich würde noch interessieren ob es den geholfen hat. Mein Hinweis war ja nur auf Verdacht

            Comment


            • #7
              Hi Ralf

              Ja klar hat es, sonst hätte ich mich nicht bedankt
              LG
              Michael

              Comment

              Working...
              X