Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

1 Θεματα (timers - threads)

Îåêßíçóå áðü ôï ìÝëïò pikos. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 02-12-2005, 14:30. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-12-2005, 12:18 7500

    1 Θεματα (timers - threads)

    Λοιπόν,
    Πρώτα απ’ όλα να σας χαιρετίσω όλους μιας και είναι νέος στην παρέα σας.

    Η εταιρία ασχολείται με  ανάπτυξη εφαρμογών κινητής τηλεφωνίας (bulk SMS, premium SMS και mobile content) επίσης έχουμε το Logolove.gr καθώς και πολλά άλλα websites αντιστοίχου περιεχομένου.

    Ανακάλυψα ότι υπάρχει πρόβλημα με το System.Timers.Timer το θέμα είναι ότι σε ακαθόριστους χρόνους αυτοί οι timers σταματούν να μετρούν ειδικότερα όταν μία εφαρμογή έχει threads. Το θέμα το έλυσα χρησιμοποιώντας το System.Threading.Timer για όσους αντιμετωπίζουν αυτό το πρόβλημα σας παραθέτω τον παρακάτω κώδικα.

     

    Public Class MyTimers

        Private myFlashOnTime As Long

        Private myFlashOffTime As Long

        Private myFlashTime As Long

        Private Flasher As System.Threading.Timer

        Private myFlashWaitTime As Long = 0

        Public Event Elapsed(ByVal sender As Object)

     

        Public Sub New()

     

        End Sub

     

        Public Sub New(ByVal Interval As Long)

            Me.Interval = Interval

        End Sub

     

        Public Property Interval() As Long

            Get

                Return myFlashWaitTime

            End Get

            Set(ByVal Value As Long)

                myFlashOnTime = Value

                myFlashWaitTime = Value

                myFlashOffTime = Value

            End Set

        End Property

     

        Public Sub Start()

            Try

                If myFlashOnTime = 0 Or myFlashOffTime = 0 Then Exit Sub

                myFlashTime = myFlashOnTime

                Flasher = New System.Threading.Timer(AddressOf DoElapsed, Nothing, myFlashWaitTime, myFlashOnTime)

            Catch ex As Exception

                Throw New Exception("Error While Trying To Start The Timer", ex)

            End Try

        End Sub

     

        Public Sub [Stop]()

            Try

                If Flasher Is Nothing Then Exit Sub

                Flasher.Change(System.Threading.Timeout.Infinite, 0)

                Flasher = Nothing

            Catch ex As Exception

                Throw New Exception("Error While Trying To Stop The Timer", ex)

            End Try

        End Sub

     

        Private Sub DoElapsed(ByVal o As Object)

            'LogWriter.AppendLog("Raising Elapsed Event")

            RaiseEvent Elapsed(Me)

        End Sub

    End Class

     

    Το πρόβλημα μου είναι το εξής:

    Έχω μία εφαρμογή (windows Service) στην οποία σηκώνω δυναμικά threads. Κάθε thread αναλαμβάνει να κάνει παρόμοιες εργασίες και όλα μαζί παίρνουν κάποια δεδομένα από ένα κοινό για όλα DataTable.

    Κάθε thread πρέπει να εκτελεί μια εργασία αφού πρώτα υπολογίσει τον χρόνο που θα πρέπει να περιμένει πριν την εκτέλεση.

    Για αυτόν τον σκοπό χρησιμοποιώ μέσα στο thread το "System.Threading.Thread.Sleep" αλλά αντί να κάνει "Sleep" μόνο το thread κάνει "Sleep" όλο το service..

    Υπάρχει τρόπος να αποφύγω την χρίση ενός ακόμα timer?


    Ευχαριστώ εκ’ των προτέρων

     

    Γιάννης

  •  02-12-2005, 12:39 7501 σε απάντηση της 7500

    Απ: 1 Θεματα (timers - threads)

    Πολλά πράγματα μαζί έπιασες! Θα απαντήσω ανάποδα:

    Thread.Sleep: Όπως λέει το documentation, "Blocks the current thread for the specified number of milliseconds.". Λογικό είναι αν την καλείς από το thread του service να μπλοκάρει το ίδιο το service. Πρέπει να την καλέσεις μέσα από τα threads που δημιούργησες.

    Timers: Δεν έχει αναφερθεί κάποιο πρόβλημα με τους Timers, φτάνει να χρησιμοποιηθούν με το σωστό τρόπο. Η λογική τους είναι ότι δημιουργείς ένα timer όταν θέλεις να αρχίσει να μετράει και τον καταστρέφεις με dispose όταν θέλεις να σταματήσει. Ο κώδικας που έγραψες δημιουργεί ένα νέο timer κάθε φορά που καλείς την Start αλλά δεν τον καταστρέφει όταν καλείς τη Stop, δημιουργώντας timer objects στη μνήμη που θα παραμείνουν μέχρι να καταστραφεί η κλάση MyTimers. Όσο για το πρόβλημα που ανέφερες, μήπως όταν δημιουργείς τα timer objects ξεχνάς να αποθηκεύσεις τα κρατήσεις σε κάποια μεταβλητή? Αν συμβαίνει αυτό, τα αντικείμενα θα καταστραφούν στο επόμενο garbage collection.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-12-2005, 13:25 7504 σε απάντηση της 7501

    Απ: 1 Θεματα (timers - threads)

    Ευχαριστώ για την άμεση απάντηση.

     

    1)      Πιστέψαμε ότι και να έκανα με τους timers κολλούσαν σε ακαθόριστες χρονικές στιγμές

     

    2)      Φυσικά και έχεις δίκιο για το .Dispose στον timer δικιά μου παράβλεψη.

     

     

    3)      Μέσα σε κάθε thread χρησιμοποιώ το: Threading.Thread.CurrentThread.Sleep(intTimerElapse) αλλά το πρόβλημα παραμένει το ίδιο..

     

    4)      Μια μικρή διευκρίνιση θα ήθελα. Όταν σηκώνω  δυναμικά τα threads θα πρέπει να κρατάω π.χ. ένα thread array αλλιώς θα καταστραφούν στο επόμενο garbage collection.?

  •  02-12-2005, 14:30 7509 σε απάντηση της 7504

    Απ: 1 Θεματα (timers - threads)

    Όσον αφορά τους timers θα επιμείνω. Η κλάση Timer από πίσω χρησιμοποιεί τα timer του λειτουργικού. Δεν έχει αναφερθεί παρόμοιο πρόβλημα ούτε για την κλάση ούτε για το λειτουργικό. Αν οι timer σταματάνε να καλούν την callback συνάρτηση σε ακαθόριστη στιγμή μπορεί να συμβαίνουν δύο πράγματα. Είτε καταστράφηκε το timer object ή έπεσε exception μέσα στο Callback. Σε αυτή την περίπτωση δεν θα λάβεις καμμία ειδοποίηση επειδή το Callback εκτελείται σε ένα thread του thread pool, στο οποίο δεν έχεις πρόσβαση.

    Όσο για το .Dispose, από τη στιγμή που το καλείς δεν χρειάζεται να καλέσεις την Timer.Change.

    Περί Thread.Sleep. Είσαι σίγουρος ότι καλείς την Thread.Sleep μέσα από το function που εκτελείται από το άλλο thread? Δες το παράδειγμα της Thread.Sleep στο documentation.

    Τέλος, υποθέτω ότι δημιουργείς αντικείμενα Thread στα οποία περνάς ένα Callback. Εφόσον δεν κρατάς κάπου τα αντικείμενα αυτά θα καταστραφούν στο επόμενο garbage collection


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems