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

 

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

Καθυστέρηση στο loading φόρμας...

Îåêßíçóå áðü ôï ìÝëïò mambo jumbo. Τελευταία δημοσίευση από το μέλος mambo jumbo στις 15-06-2011, 12:13. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-06-2011, 16:34 66230

    Καθυστέρηση στο loading φόρμας...

    Καλησπέρα σε όλοyς.

       Αντιμετωπίζω ένα πρόβλημα με το loading της φόρμας. Συγκεκριμένα η φόρμα έχει ComboBoxes και dataGridView. Όλα αυτά τα control είναι bind με κάποιο DataSource το οποίο στις περισσότερες περιπτώσεις είναι ένα typed DataTable. Το θέμα τώρα είναι πως την πρώτη φορά που ανοίγει η φόρμα καθυστερεί μερικά δευτερόλεπτα (από 1 έως 4 ανάλογα με τα control που κουβαλάει). Τα 4 δευτερόλεπτα για παράδειγμα παρουσιάζονται σε φόρμα με 11 ComboBoxes και 1 DataGridView.

       Υποθέτω πως η καθυστέρηση προκύπτει λόγω binding στο control, αλλά δε γνωρίζω κάποια μέθοδο που θα βοηθήσει στη βελτίωση των χρόνων... Έχετε μήπως να προτείνετε κάποια λύση?
    Το ngen θα μπορούσε αποτελέσει λύση?


    Ευχαριστώ προκαταβολικά

    Χρήστος

    ΥΓ: το dev γίνεται σε VS2010Pro με .NET 3.5 και C#
  •  10-06-2011, 17:51 66231 σε απάντηση της 66230

    Απ: Καθυστέρηση στο loading φόρμας...

    Οι φόρμες σε κανονικές εφαρμογές έχουν κατά κανόνα πολύ περισσότερα από 11 control και δεν καθυστερούνε. Κατά πάσα πιθανότητα το πρόβλημα έχει να κάνει με τον τρόπο που δημιουργείς τη φόρμα και κάνεις το binding. Πως το κάνεις αυτό? Με κώδικα, μέσα από το designer? Το κάθε combo από που τραβάει τις τιμές του? Πως το γεμίζεις, με κώδικα ή με binding? Και αν με binding από ποιό datasource?

    Το σίγουρο είναι ότι το ngen δεν πρόκειται να βοηθήσει όταν τα προβλήματα βρίσκονται στον κώδικα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-06-2011, 23:07 66232 σε απάντηση της 66230

    Απ: Καθυστέρηση στο loading φόρμας...

    Επειδή ανέφερες ότι η καθυστέρηση γίνεται μόνο την πρώτη φορά που ανοίγει μία φόρμα θα ήθελα να σε ενημερώσω επάνω σε αυτό πως πάντα την πρώτη φορά που κάνεις σύνδεση με την βάση η διαδικασία θα κάνει λίγο παραπάνω από ότι τις επόμενες φορές. Οπότε σίγουρα εκεί μπορούμε να αποδόσουμε ένα ποσοστό της καθυστέρησης γιατί δεν έχει γίνει cache κάποιο connection ακόμα. Τα 4 δευτερόλεπτα όμως είναι αρκετός χρόνος.

    Οπότε η πιο πιθανή αιτία είναι ο αριθμός των δεδομένων που φορτώνεις και ο τρόπος που το κάνεις αυτό. Μόνο υποθέσεις μπορεί να κάνει κάποιος από εδώ και πέρα. Για παράδειγμα υποθέτω πως τα 11 combo boxes έχουν lookup τιμές. Οπότε για να γεμίσεις και τα 11 με τις διαθέσιμες τιμές θα πρέπει να κάνεις 11 ερωτήματα στην βάση συν 1 για το grid. Για πόσες εγγραφές συνολικά μιλάμε; Πόσες συνδέσεις ανοίγεις; Ανοίγεις μία για όλα;

    Όπως άφησες να εννοηθεί αυτό γίνεται μόνο την πρώτη φορά. Οπότε αν ανοίξεις ξανά την φόρμα τότε ο χρόνος που χρειάζεται σε ικανοποιεί και δεν έχεις πρόβλημα. Άρα υποθέτω τα ερωτήματά σου στην βάση είναι σωστά.

  •  11-06-2011, 09:20 66233 σε απάντηση της 66232

    Απ: Καθυστέρηση στο loading φόρμας...

    Επίσης, ποιό είναι το μέγεθος των δεδομένων που έρχονται στη φόρμα; Πόσες εγγραφές είναι ο κύριος πίνακας του gridview και πόσες οι lookup; Αν μιλάμε για πάαααρα πολλές εγγραφές υπάρχουν τεχνικές για να βελτιώσεις την κατάσταση. Επίσης, στην περίπτωση που οι lookup πίνακες χρησιμοποιούνται σε όλο το πλάτος και μήκος της εφαρμογής και πάλι μπορείς να φτιάξεις μηχανισμό που να διατηρεί αυτά τα data κάπου, να φορτώνονται μία φορά κατά την εκκίνηση της εφαρμογής (και όχι της φόρμας) παράλληλα με ένα splash screen. Άλλά όλα αυτά εξαρτώνται από τις λεπτομέρειες που δεν μας έχεις πει.


    Vir prudens non contra ventum mingit
  •  11-06-2011, 11:58 66236 σε απάντηση της 66233

    Απ: Καθυστέρηση στο loading φόρμας...

       Ευχαριστώ για τις απαντήσεις.

       Το φόρτωμα γίνεται μία φορά, σε ένα typed DataSet και το lookup γίνεται για κάθε control σε κάποιο DataTable του εν λόγω dataset.
    Τα data είναι μάλλον πολλά. Ο χρόνος που χρειάζεται να γεμίσει το dataset είναι ανεπαίσθητος (σε ένα connection γίνεται όλη η δουλειά.)

      Για παράδειγμα, για να γεμίσω ένα combobox με τιμές των person, στον designer επιλέγω για databinding source του control το DataTable Person, όπου
    δηλώνω ως Key την στήλη ID του πίνακα και πεδίο εμφάνισης την στήλη Name του πίνακα...

    Στον κώδικα το μόνο που κάνω είναι να δηλώσω ως DataSource του control το DataTable το οποίο έχω γεμίσει νωρίτερα με τις τιμές.

    Αυτό που θέλουν είναι στα control να είναι φορτωμένες όλες οι τιμές. Οπότε φαντάζομαι πως αν με κάποιο τρόπο μπορούσα τουλάχιστον
    να σχεδιάσω και να εμφανίσω τη φόρμα πριν γεμίσουν τα data δε θα είχαν κάποια αντίρρηση.
  •  13-06-2011, 21:21 66272 σε απάντηση της 66236

    Απ: Καθυστέρηση στο loading φόρμας...

    Οπότε να το πάρω λίγο από την αρχή για να γνωρίζουμε ότι ήμαστε στην ίδια λογική.

    Τα έντεκα combo boxes όντως έχουν lookup τιμές οι οποίες χρησιμοποιούνται για τις εγγραφές του κεντρικού grid της φόρμας. Οπότε όταν ανοίγει η φόρμα, χρειάζεσαι να τραβήξεις δεδομένα από 11 πίνακες, που είναι οι εγγραφές lookup συν από τον κεντρικό πίνακα που είναι οι εγγραφές του grid. Και η καθυστέρηση συμβαίνει μόνο την πρώτη φορά. Τις επόμενες φορές που καλείς την φόρμα δεν παρατηρείς την καθυστέρηση αυτή.

    Αυτό το τελευταίο είναι κάτι που με προβληματίζει πιο πολύ. Αν υπήρχε λάθος στον κώδικά σου θα παρατηρούσες πάντα μία σχετική καθυστέρηση. Αν είχες να διαβάσεις μεγάλο αριθμό εγγραφών κάθε φορά θα υπήρχε μία σχετική καθυστέρηση. 

    Μία ερώτηση ακόμα για να καλύψω την αρχική καθυστέρηση που σου εμφανίζεται. Μήπως χρησιμοποιείς controls τρίτου κατασκευαστή με ενεργοποιημένο κάποιο σχετικό skin του κατασκευαστή; Για παράδειγμα οι φόρμες της DevExpress με ενεργοποιημένο skin φορτώνουν πιο αργά από ότι χωρίς την πρώτη φορά. Το ίδιο βέβαια γίνεται για όλες τις φόρμες και τα controls του VS αλλά σαφέστατα η καθυστέρηση είναι πιο μικρή χρησιμοποιώντας τα default controls του VS.

    Όσο για το τελευταίο που ζητάς, δηλαδή να σχεδιάσεις την φόρμα και να την εμφανίσεις πριν γεμίσει με δεδομένα τα πράγματα δεν είναι τόσο απλά γιατί φαντάζομαι ότι ο κώδικας σου είναι single thread οπότε το πάγωμα στην οθόνη μέχρι να ολοκληρωθεί ο κώδικάς σου πάντα θα υπάρχει. Για αρχή θα κοιτούσα δύο events. Το Load της φόρμας, το οποίο ενεργοποιείτε λίγο πριν εμφανιστεί η φόρμα και το HandleCreated το οποίο ενεργοποιείτε αμέσως μετά που θα εμφανίσουμε την φόρμα. Και τα δύο events γίνονται raise πάντα μία φορά, δηλαδή αν παίξουμε το visibility της φόρμας δεν θα γίνουν raise ξανά.

  •  14-06-2011, 21:21 66298 σε απάντηση της 66272

    Απ: Καθυστέρηση στο loading φόρμας...

    Normal 0 false false false EL X-NONE X-NONE MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Κανονικός πίνακας"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;}

    Γιώργο ευχαριστώ για την απάντηση...

      Τα control που χρησιμοποιώ είναι τα default του VS.

    Ίσως εάν αναρτούσα κάποιο κομμάτι από τον κώδικα αυτό να βοηθούσε, αλλά το θέμα είναι πως στην εταιρία για την οποία εργάζομαι, τα ζητήματα ασφάλειας λαμβάνονται πολύ σοβαρά και ακόμα και αν μου επιτρέψουν να προχωρήσω σε κάτι τέτοιο θα απαιτούσε πολλές ημέρες έως ότου λάβω τη σχετική έγκριση.... :(

    Από ότι έχω διαβάσει μέχρι τώρα στο διαδίκτυο πολλοί αντιμετωπίζουν παρόμοια προβλήματα:

    http://stackoverflow.com/questions/1716094/delay-loading-of-combobox-when-form-loads

    Θα δοκιμάσω τις BeginUpdate και EndUpdate functions που αναφέρονται στο σχετικό post και θα σας ενημερώσω.

    Στο εντωμεταξύ αν κάποιος έχει να προτείνει κάτι είμαι όλος αφτιά :)

    Ευχαριστώ,

    Χρήστος

  •  14-06-2011, 22:42 66299 σε απάντηση της 66298

    Απ: Καθυστέρηση στο loading φόρμας...

    Ρίξε μια ματιά εδώ.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  15-06-2011, 12:13 66306 σε απάντηση της 66299

    Απ: Καθυστέρηση στο loading φόρμας...

    Normal 0 MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman";}

    Οκ ευχαριστώ για τις απαντήσεις παιδιά...

    Τελικά εντοπίστηκε το πρόβλημα και δεν είναι τελικά το binding των control...

     





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