VB.NET Windows Service Question (Timing)

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • ggillard@gmail.com

    #1

    VB.NET Windows Service Question (Timing)

    Hi,

    I'm new to writing services and found it pretty easy using VB.NET.

    My service has an internal timer that fires every 3 seconds. Each
    time it fires it opens a SQL DB and looks for a specific set of
    records. Each record it finds it sends to SAP and then changes their
    status so they won't be sent again.

    When I run this code out side of a service ( I built a small
    userinterface for testing) it runs flawlessly. However the service
    will start duplicating (sending records 2-4 times). In this example I
    put about 500 records in the table and start the service. It works
    great for the first 30 records.

    It seems as if it gets interrupted before it gets a chance to flag a
    record as already processed and then the next time it fires it finds
    the "already processed" data as needing to be processed.

    What am I missing with a "windows service" that would interupt my code
    AND not resume at the point of interruption? It's almost as if the
    program re-starts over an over again.

    Any help or ideas are appreciated.

  • sfbell09@gmail.com

    #2
    Re: VB.NET Windows Service Question (Timing)

    How is your service working? Is it starting a new thread every 3
    seconds to perform the required actions? Or are is it one thread in a
    forever type loop with a 3 second pause at the bottom?

    Next, how is the database being checked/updated? If you aren't doing
    so, I would suggest a stored procedure that performs the check and
    updates each record before moving on to the next.

    Can you show some / all of the code? It would help out.


    ggillard@gmail. com wrote:[color=blue]
    > Hi,
    >
    > I'm new to writing services and found it pretty easy using VB.NET.
    >
    > My service has an internal timer that fires every 3 seconds. Each
    > time it fires it opens a SQL DB and looks for a specific set of
    > records. Each record it finds it sends to SAP and then changes their
    > status so they won't be sent again.
    >
    > When I run this code out side of a service ( I built a small
    > userinterface for testing) it runs flawlessly. However the service
    > will start duplicating (sending records 2-4 times). In this example I
    > put about 500 records in the table and start the service. It works
    > great for the first 30 records.
    >
    > It seems as if it gets interrupted before it gets a chance to flag a
    > record as already processed and then the next time it fires it finds
    > the "already processed" data as needing to be processed.
    >
    > What am I missing with a "windows service" that would interupt my code
    > AND not resume at the point of interruption? It's almost as if the
    > program re-starts over an over again.
    >
    > Any help or ideas are appreciated.[/color]

    Comment

    • Jim Wooley

      #3
      Re: VB.NET Windows Service Question (Timing)

      > Hi,[color=blue]
      >
      > I'm new to writing services and found it pretty easy using VB.NET.
      >
      > My service has an internal timer that fires every 3 seconds. Each
      > time it fires it opens a SQL DB and looks for a specific set of
      > records. Each record it finds it sends to SAP and then changes their
      > status so they won't be sent again.
      >
      > When I run this code out side of a service ( I built a small
      > userinterface for testing) it runs flawlessly. However the service
      > will start duplicating (sending records 2-4 times). In this example I
      > put about 500 records in the table and start the service. It works
      > great for the first 30 records.
      >
      > It seems as if it gets interrupted before it gets a chance to flag a
      > record as already processed and then the next time it fires it finds
      > the "already processed" data as needing to be processed.
      >
      > What am I missing with a "windows service" that would interupt my code
      > AND not resume at the point of interruption? It's almost as if the
      > program re-starts over an over again.
      >
      > Any help or ideas are appreciated.[/color]

      It sounds like you are running into an issue of multiple threads operating
      at the same time. If the processing takes more than 3 seconds, you may have
      a currently running process that doesn't block out another process from starting.
      You may want to put a SynchLock around the process or otherwise check to
      see if a process is already running before firing another one off.

      Jim Wooley



      Comment

      • ggillard@gmail.com

        #4
        Re: VB.NET Windows Service Question (Timing)

        I believe it's single threaded since I didn't do anything to (nor do I
        know enough) to make it multi-threaded.

        There is an event timer that fires every 3000 milliseconds (no loop
        code).

        This VB.NET App can't pass the operation off to SQL stored proc because
        it has to pass the data it finds in the SQL app through IBM Websphere
        MQ to be received and processed by SAP. If a transaction fails I won't
        know until SAP responds.

        Records have status of (simplified)
        1=Being created (don't process)
        2=Done and ready for service to send to SAP
        3=Sent to SAP (waiting for response)
        4=SAP responded success
        5=SAP responded failure

        100s of users add records to the SQL DB. This service just looks for
        records with a status of 2 and watches for SAP responses to previously
        posted records.

        Nearly all of the code is bundled into a number of class modules
        compiled into a DLL.

        If I reference this DLL from a standard VB.NET (with forms) which also
        has a 3000 millisecond timer it performs flawlessly. Even if it wakes
        up to find 5000 records to process.

        The same code referenced from a VB.NET service starts screwing up after
        about 30 records. It seems like it probably has something to do with
        how a service gets "time slices" or as you said "threading" . This is
        where I lack the knowledge and it's tough to debug/troubleshoot a
        VB.NET service. The problem does not occur unless there are enough
        records to keep the service busy for a few seconds.

        Thanks for the response.

        Comment

        • Phill W.

          #5
          Re: VB.NET Windows Service Question (Timing)

          ggillard@gmail. com wrote:
          [color=blue]
          > When I run this code out side of a service ( I built a small
          > userinterface for testing) it runs flawlessly. However the service
          > will start duplicating (sending records 2-4 times).[/color]
          [color=blue]
          > It seems as if it gets interrupted before it gets a chance to flag a
          > record as already processed and then the next time it fires it finds
          > the "already processed" data as needing to be processed.[/color]

          I think the problem is that the Timer is firing, starting your
          long-running database process abd, before that's finished properly, the
          timer is firing /again/.

          As a general rule, I disable/stop the Timer when I enter the Elapsed
          routine, and restart it on the way out.

          Sub Timer1_Elapsed ' or Tick - can't remember which
          Try
          Timer1.Stop
          Call LongRunningProc ess()
          Finally
          Timer1.Start
          End Try
          End Sub

          Or, alternatively, replace the Timer with calls to Sleep() instead, as in

          Private m_bKillLoop as Boolean = False

          Sub Run()
          Do While Not m_bKillLoop
          Call LongRunningProc ess()

          If Not m_bKillLoop Then
          System.Threadin g.Thread.Sleep( 3000)
          End If
          Loop
          End Sub

          HTH,
          Phill W.

          Comment

          Working...