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

 

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

warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

Îåêßíçóå áðü ôï ìÝëïò grglaz. Τελευταία δημοσίευση από το μέλος grglaz στις 18-08-2011, 22:22. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-08-2011, 13:06 66777

    warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    Καλημερα σε ολους

    τοσο καιρο εγραφα με visual C# 2010 express edition και τωρα που ανοιξα την εφαρμογη μου με visual studio 2010 ultimate μου εμφανιστηκαν καποια warning που η express δεν τα εμφανιζει...

    συγκεκριμενα στον κωδικα που εχω για να ανοιγω καποιες φορμες πατωντας καποιο button
        
            private void button12_Click(object sender, EventArgs e)
            {
                Tools___Function_Generator Function_Generator = new Tools___Function_Generator();           
                Function_Generator.Show();
            }

    μου δημιουργει warning

    "CA2000 : Microsoft.Reliability : In method 'Form1.button12_Click(object, EventArgs)', call System.IDisposable.Dispose on object 'Function_Generator' before all references to it are out of scope."


    επισης ενα παρομοιο warning εχω στον κωδικα που διαβαζω ενα xml σε εναν σερβερ...

                string updatetextvalue = null;
                XmlTextReader reader_text = new XmlTextReader("url/filename.xml");           
                while (reader_text.Read())
                {
                    switch (reader_text.NodeType)
                    {
                        case XmlNodeType.Text: //Display the text in each element.
                            updatetextvalue = reader_text.Value;
                            break;
                    }
                    if (updatetextvalue == "yes")
                    {
                        linkLabel_update.Text = "Yπάρχει διαθέσιμη νέα έκδοση...";
                        linkLabel_update.Enabled = true;
                    }
                    else
                    {
                        linkLabel_update.Text = "Δεν υπάρχει διαθέσιμη νέα έκδοση...";
                        linkLabel_update.Enabled = false;
                    }
                }
                reader_text.Close();

    warning

    "CA2000 : Microsoft.Reliability : In method 'Form1.Form1()', object 'reader_text' is not disposed along all exception paths. Call System.IDisposable.Dispose on object 'reader_text' before all references to it are out of scope."

    τι σημαινουν τωρα αυτα και πως τα διορθωνω,ας με διαφωτισει καποιος....

  •  08-08-2011, 16:18 66781 σε απάντηση της 66777

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    οκ λυθηκαν χρησιμοπoιωντας τη δηλωση using{}
    Smile
  •  17-08-2011, 21:04 66829 σε απάντηση της 66781

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    ξαναεπανερχομαι στο θεμα γιατι η λυση με τα using μου δημιουργει αλλο προβλημα....

    δηλαδη χρησιμοποιωντας
            private void button12_Click(object sender, EventArgs e)
            {
                using (Tools___Function_Generator Function_Generator = new Tools___Function_Generator())
                {   
                Function_Generator.ShowDialog();
                }
            }

    δεν μπορω να χρησιμοποιησω την αρχικη φορμα αν δεν κλεισω την δευτερη...

    τι κανουμε σ αυτη τη περιπτωση....καποια βοηθεια κατι...


  •  18-08-2011, 09:27 66832 σε απάντηση της 66829

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    Ανάλογα και με το τι είδους εφαρμογή κάνεις, μην δίνεις και πολύ σημασία σε αυτά τα warnings. Θα περάσει ο Garbage Collector να τα μαζέψει!

    Πιο σημαντικό είναι σε αυτό το στάδιο να έχεις σωστή ονοματολογία, πχ στα controls (button12? Μα γιατί) και τα ονόματα των κλάσεων (___ ? μήπως υπερβάλλεις;) παρά να φτάσουμε στην διαχείριση των resources!

    Παρόλα αυτά, και εάν επιμένεις, ανάλογα με την δομή της εφαρμογής σου (είναι MDI? είναι κάτι άλλο;) είναι καλό να καλέσεις τις μεθόδους Dispose() των εκάστοτε Disposable objects, στην περίπτωσή σου των φορμών. Απλά πρέπει να βρεις το κατάλληλο σημείο.



    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  18-08-2011, 12:48 66834 σε απάντηση της 66832

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    Αντιθέτως, δώσε σημασία. Για να υλοποιεί το using μία κλάση σημαίνει ότι την ενδιαφέρει και πολύ μάλιστα να ελευθερώσει τα resources της πριν τρέξει ο garbage collector. Αυτό ισχύει τόσο για αντικείμενα που ζωγραφίζουν στην οθόνη (και χρησιμοποιούν συνεπώς GDI resources) όσο και για database connections (που παραμένουν ανοικτά αν δεν κληθεί η Close/Dispose) όσο και για streams (το ίδιο). Και μάλιστα, αυτό ισχύει ΑΣΧΕΤΩΣ ΕΙΔΟΥΣ ΕΦΑΡΜΟΓΗΣ. Η μόνη διαφορά είναι πόσο γρήγορα θα αντιμετωπίσεις πρόβλημα αν δεν κάνεις έγκαιρα dispose. Σε μία server εφαρμογή τα resource leaks (memory ή connection) θα συσσωρεύονται πολύ γρηγορότερα απ' ότι σε μία desktop.

    Το using δεν είναι κάποιο περίεργο ή ιδιαίτερο construct, αλλά κάτι που χρησιμοποιείται παντού στο .NET. Πρόβλημα δεν πρόκειται να σου δημιουργήσει αν δεν προσπαθείς να χρησιμοποιήσεις κάποιο instance αφού το έχεις κλείσει. Απλά, θα πρέπει να βάλεις όλο τον κώδικα που χρησιμοποιεί τη φόρμα που ανοίγεις μέσα στο using. Το πρόβλημα είναι στον κώδικα σου, όχι στο using.

    Επιπλέον, η ShowDialog() λέει ότι θέλεις να δείξεις μία φόρμα οπωσδήποτε ως dialog το οποίο δεν θα επιτρέπει να χρησιμοποιήσεις άλλη φόρμα χωρίς να κλείσεις το dialog. Με άλλα λόγια, κάνει αυτό που του ζήτησες. Αν θέλεις να φτιάξεις κάποια MDI εφαρμογή θα πρέπει να χρησιμοποιήσεις την Show() αντί για την ShowDialog και να χρησιμοποιήσεις κάποιο πεδίο στην κλάση σου αντί για μεταβλητή στο function. Διαφορετικά, η child φόρμα θα μείνει αμανάτι μόλις βγεις από το function. Τέλος, στο Dispose της parent form θα πρέπει να καθαρίσεις αυτά τα πεδία για να αποφύγεις leaks.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-08-2011, 13:50 66835 σε απάντηση της 66834

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    Σας ευχαριστω πολυ για τις απαντησεις...

    @dimos.homatas
    Τα ονοματα στα buttons τα εχω φτιαξει πλεον καθαρα για τυπικους λογους μιας και δεν τα ξαναχρησιμοποιω οποτε δεν με κουραζανε...οσο για το "___" εχω συνηθισει φτιαχνοντας μια νεα φορμα να βαζω " - " αναμεσα στις δυο λεξεις  γι αυτο...

    Τωρα στο θεμα μου

    Εχω μια κεντρικη φορμα με διαφορα buttonς ως μενου...τα οποια ανοιγουν τις αντιστοιχες φορμες "εργαλεια"..
    Αλληλεπιδραση δεν εχουν μεταξυ τους (λογικο) απλα με ενδιαφερει να μην δεσμευομαι στο ανοιγμα ενος εργαλειου για δυο λογους,1 να μπορω να κανω minimize την κεντρικη φορμα και 2 να μπορω να ανοιξω και δευτερο εργαλειο χωρις να κλεισω το 1ο.

    @Παναγιώτης Καναβός
    χρησιμοποιωντας το using ετσι
    private void button_Function_Generator_Click(object sender, EventArgs e)
    {
        using (Tools___Function_Generator Function_Generator = new Tools___Function_Generator())
        {   
            Function_Generator.Show();
        }
    }

    το παραθυρο απλα ανοιγει και κλεινει κατευθειαν.

    επισης το ιδιο γινεται ετσι...

    private void button_Function_Generator_Click(object sender, EventArgs e)
    {
       Tools___Function_Generator Function_Generator = new Tools___Function_Generator();  
       Function_Generator.Show();
       Function_Generator.Dispose();         
    }


  •  18-08-2011, 14:43 66836 σε απάντηση της 66835

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    Όπως σου είπα ήδη, αν θέλεις να διατηρηθεί η φόρμα και έξω από το function, ΜΗΝ ΧΡΗΣΙΜΟΠΟΙΕΙΣ LOCAL VARIABLES. Φτιάξε ένα πεδίο και αποθήκευσε εκεί το αντικείμενο σου. Δεν πρόκειται να βγει warning για το πεδίο, απλά γιατί δεν βγαίνει out of scope. Συνεπώς, δεν χρειάζεται και using. Θα πρέπει όμως να κάνεις override την Dispose της parent φόρμας και εκεί να κάνεις dispose το πεδίο.

    Και τα πολλαπλά _ είναι πολύ κακή πρακτική. Το συνηθισμένο είναι το CamelCasing.

    Υποψιάζομαι ότι μάλλον είναι η πρώτη φορά που ασχολείσαι με .NET και Windows Forms. Μάλλον θα πρέπει να ξεκινήσεις με τα βασικά του .NET και μετά να προχωρήσεις σε MDI εφαρμογές ή tool windows. Θα σου πρότεινα να ξεκινήσεις με τα μαθήματα στο Beginner Developer Learning Center για Windows Forms. Ίσως να μην χρειάζεται να ξεκινήσεις από το πρώτο επίπεδο, αλλά θα πρέπει πρώτα να το δεις για να είσαι σίγουρος.

    Aν όντως θέλεις να φτιάξεις εφαρμογή MDI, θα πρέπει να θέσεις το MdiParent property να δείχνει την parent form. Σε αυτή την περίπτωση ΚΑΙ ΜΟΝΟ μπορείς να αγνοήσεις το warning αν εμφανιστεί, καθώς η parent form θα αναλάβει έτσι να καθαρίσει τις child forms όταν χρειαστεί. Μπορείς να διαβάσεις περισσότερα για MDI Applications στο Multiple-Document Interface (MDI) Applications το οποίο περιέχει οδηγίες βήμα-βήμα για το πως να δημιουργήσεις φόρμες με σωστό τρόπο. Συγκεκριμμένα, πρέπει οπωσδήποτε να κάνεις τα βήματα που περιγράφονται στο "How To: Create MDI Parent Forms" και "How To: Create MDI Child Forms".Εναλλακτικά, αν όντως θέλεις να φτιάξεις εφαρμογή MDI, θα πρέπει να θέσεις το MdiParent property να δείχνει την parent form. Σε αυτή την περίπτωση ΚΑΙ ΜΟΝΟ μπορείς να αγνοήσεις το warning αν εμφανιστεί, καθώς η parent form θα αναλάβει έτσι να καθαρίσει τις child forms όταν χρειαστεί. Μπορείς να διαβάσεις περισσότερα για MDI Applications στο Multiple-Document Interface (MDI) Applications το οποίο περιέχει οδηγίες βήμα-βήμα για το πως να δημιουργήσεις φόρμες με σωστό τρόπο. Συγκεκριμμένα, πρέπει οπωσδήποτε να κάνεις τα βήματα που περιγράφονται στο "How To: Create MDI Parent Forms" και "How To: Create MDI Child Forms".

    Πέρα από τα video και τα tutorials, μπορείς να βρεις και βιβλία για .ΝΕΤ programming. Σχεδόν όλα τα βιβλία για .NET καλύπτουν και τα Windows Forms. Θα σου πρότεινα να ξεκινήσεις με το Head First C#, το οποίο σε εισάγει στην C# με απλό και διασκεδαστικό τρόπο.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-08-2011, 15:37 66837 σε απάντηση της 66836

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    Παναγιώτης Καναβός:

    Όπως σου είπα ήδη, αν θέλεις να διατηρηθεί η φόρμα και έξω από το function, ΜΗΝ ΧΡΗΣΙΜΟΠΟΙΕΙΣ LOCAL VARIABLES. Φτιάξε ένα πεδίο και αποθήκευσε εκεί το αντικείμενο σου. Δεν πρόκειται να βγει warning για το πεδίο, απλά γιατί δεν βγαίνει out of scope. Συνεπώς, δεν χρειάζεται και using. Θα πρέπει όμως να κάνεις override την Dispose της parent φόρμας και εκεί να κάνεις dispose το πεδίο.


    Οκ οποτε εστιαζω σ αυτη την λυση...να το ψαξω λιγακι περισσοτερο γιατι δεν μπορω να πω οτι το πολυκαταλαβα...
    Οπως ειπα στην αρχη εδω και καιρο εγραφα στην express edition και δεν εμφανιζε καποιο warning οποτε και δεν ειχα ασχοληθει.

    Parent και Child σχεδιαση δεν νομιζω οτι κανει για την περιπτωση μου γιατι αν δε κανω λαθος θα πρεπει ολες μου οι φορμες "εργαλεια" να ανοιγουν μεσα στην κεντρικη φορμα πραγμα το οποιο εγω δεν θελω.
    εγω θελω η κεντρικη μου φορμα με το menu να ειναι ανεξαρτητη απο τις φορμες "εργαλεια".

    Τελος παντων νομιζω αρκετα σας κουρασα....ευχαριστω και για το λινκ με τα tutorial δεν το ειχα ανακαλυψει Smile
  •  18-08-2011, 15:54 66838 σε απάντηση της 66837

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    Δεν έχει καμμία σημασία ότι δούλευες με το VS Express. Το πρόβλημα είναι στον κώδικα, όχι στην έκδοση του Visual Studio. Όταν δημιουργείς ένα αντικείμενο που παρέχει την Dispose πρέπει να την καλείς όσο γίνεται πιο σύντομα όταν δεν θα χρειάζεσαι πλέον το αντικείμενο. Παρέχοντας την Dispose() η κλάση σου λέει ότι έχει κάτι το οποίο πρέπει να καθαριστεί γρήγορα και δεν πρέπει να περιμένει μέχρι να την καθαρίσει ο garbage collector. Αυτό ισχύει ιδιαίτερα για connections και  streams επειδή κλειδώνουν πίνακες ή αρχεία και μπορούν να οδηγήσουν σε μπλοκαρίσματα αν παραμείνουν ανοικτά για πολύ χρόνο.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-08-2011, 22:22 66840 σε απάντηση της 66838

    Απ: warning "CA2000 : Microsoft.Reliability : In method 'X', call System.IDisposable.Dispose on object 'Y' before all references to it are out of scope.

    Ναι Παναγιώτη δεν είπα οτι έφταιγε το πρόγραμμα...και προφανώς φταίει ο κώδικας μου.
    Λοιπον το εκανα ετσι
    Private Tools___Function_Generator Function_Generator;
    
    private void button_Function_Generator_Click(object sender, EventArgs e)
            {
                if (Function_Generator != null)
                {
                    Function_Generator.Dispose();
                }
                Function_Generator = new Tools___Function_Generator();
                Function_Generator.Show();          
            }

    Ειμαι ενταξει η θελει και τιποτα να προσθεσω?

    Παντος λειτουργει μια χαρα και γλιτωσα και τα διπλοπαραθυρα...

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