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

 

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

Ερώτηση για δημιουργία ενός αντικειμένου σε μια μέθοδο

Îåêßíçóå áðü ôï ìÝëïò m6s. Τελευταία δημοσίευση από το μέλος m6s στις 02-01-2008, 12:48. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  26-12-2007, 19:45 38638

    Ερώτηση για δημιουργία ενός αντικειμένου σε μια μέθοδο

    Καλησπέρα, Χρόνια Πολλά, έχω ένα θέμα που με προβληματίζει, το οποίο είναι όπως φαίνεται απο το παρακάτω κώδικα, η αρχικοποίηση ενός object ( εδώ thread λόγω ότι αυτό πειράζω εξαιτίας ενός βοηθήματος που διαβάζω για delegates ) anyway"s"....Το θέμα είναι ότι δημιουργώ ένα object μέσα στην μέθοδο. Το επιστρέφω στην Main και εκτελώ πολύ ωραία την Start.
    Εν ολίγοις, το workerThread τελικά θα μείνει στην μνήμη; Ως πότε; Πώς να το κάνω dispose?
    Ο μόνος τρόπος που βλέπω είναι να έχω το workerThread σαν property, και να ελέγχω αν είναι null ή όχι. (Νομίζω C,C++ way...)
    Υπάρχει άλλος τρόπος;  Τέτοιο κώδικα έχω ξαναδεί, και με προβληματίζει ας πούμε να θέλουμε να σηκώσουμε την φόρμα τιμολόγησης, 100 φορές σε μια μέρα...τι θα γίνει;!

        class SomeClass{
                public Thread LaunchThread(){
                    Thread workerThread = new Thread( delegate() {
                            Console.WriteLine( "From thread, hello all!" );
                        } );
                    return workerThread;
                }
            }
        }

    class MainApp{
            static void Main(string[] args){
                SomeClass test = new SomeClass();
                test.LaunchThread().Start();
            }

    Ευχαριστώ,
    Δημήτρης
  •  26-12-2007, 20:02 38639 σε απάντηση της 38638

    Απ: Ερώτηση για δημιουργία ενός αντικειμένου σε μια μέθοδο

    Βασικά, η κλάση Thread δεν έχει Dispose μέθοδο. Έτσι όπως δίνεις το sample το workerThread έχει το property IsBackground false (by default είναι έτσι, άμα κάνεις instance ενός Thread), οπότε, εφ'όσον είναι Foreground thread, θα εμποδίσει το process να τερματίσει. Μια εφαρμογή κλείνει τελείως, όταν τερματίσουν όλα τα foreground threads της. Αν υπάρχουν και Background threads που τρέχουνε, τότε το CLR τα τερματίζει αυτόματα. Αν θες να το δεις, άλλαξε το anonymous method ως εξής

    delegate()
    {
       Thread.Sleep(3000);
       Console.WriteLine("From thread, hello all!");
    }

    Αν θες να αλλάξει αυτή η συμπεριφορά, άλλαξε το IsBackground του Thread σε true.

    Όσον αφορά τη φόρμα τιμολόγησης: Αν κατάλαβα καλά, το πρόβλημα είναι ότι σηκώνεις πολλές φορές το ίδιο αντικείμενο;;; Αν είναι έτσι, τότε είτε μπορείς να το έχεις κάπου σαν static, ώστε να είναι μία μόνο φορά σηκωμένο, είτε μπορείς να υλοποιήσεις το singleton pattern.


    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
  •  27-12-2007, 00:56 38644 σε απάντηση της 38639

    Απ: Ερώτηση για δημιουργία ενός αντικειμένου σε μια μέθοδο

    Βασικά όπως είπα απο tutorial για threads είναι ο κώδικας και δεν καταλαβαίνω πάρα πολλά.Confused
    Το ερώτημα έχει να κάνει γενικά με object και όχι τόσο για threads.
    Δηλαδή χωρίς static,
    1. Δεν ελέγχεις το νέο αντικείμενο
    αν κατάλαβα καλά.
    2. δεν μπορείς να ξέρεις τελικά τι γίνεται, ιδιαίτερα σε περίπτωση που ξανατρέξεις την γραμμή στην Main ;
    Σε ευχαριστώ.
    ( Αυτή την παρατήρηση για το IsBackground, δεν το γνώριζα )
  •  28-12-2007, 11:56 38668 σε απάντηση της 38644

    Απ: Ερώτηση για δημιουργία ενός αντικειμένου σε μια μέθοδο

    m6s:

    Δηλαδή χωρίς static,
    1. Δεν ελέγχεις το νέο αντικείμενο
    αν κατάλαβα καλά.

    όταν λες "ελέγχεις"; η χρησιμότητα για την οποία σου είπα το static έχει σχέση με τη φόρμα τιμολόγησης που ρώτησες. Αν κάνεις πολλά "new" ένα αντικείμενο, και δεν τα πας τόσο καλά από performance, τότε μπορείς να έχεις ένα instance του σε μια κλάση σαν static, ώστε να γίνει "new" μία φορά.

    Δες εδώ για το keyword static, σε περίπτωση που κάτι σου διαφεύγει Smile

    m6s:

    2. δεν μπορείς να ξέρεις τελικά τι γίνεται, ιδιαίτερα σε περίπτωση που ξανατρέξεις την γραμμή στην Main ;
    Σε ευχαριστώ.

    πάλι δεν σε πιάνω. Εφ'όσον το thread εσύ αυτή τη στιγμή το έχεις σαν foreground, το main process θα περιμένει μέχρι να κλείσει το thread που ξεκίνησες. Εφ'όσον σηκώσεις κι άλλα τέτοια foreground threads, το main process θα περιμένει να εκτελεστούν. Αν ρωτάς για το πότε θα φύγουνε από τη μνήμη, αυτό είναι απρόβλεπτο, λόγω της μη ντετερμινιστικής εκτέλεσης του GC. Όταν αυτά τα objects είναι out of scope, κάάάποια στιγμή θα τα "καθαρίσει" κ ο σκουπιδοσυλλέκτης.

    χρόνια πολλά Smile


    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
  •  02-01-2008, 12:48 38747 σε απάντηση της 38668

    Απ: Ερώτηση για δημιουργία ενός αντικειμένου σε μια μέθοδο

    Χρόνια Πολλά, και ευχαριστώ για τις απαντησεις :-)
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems