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

 

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

Asynchronous calls

Îåêßíçóå áðü ôï ìÝëïò Adamantios. Τελευταία δημοσίευση από το μέλος Adamantios στις 22-01-2008, 12:42. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-01-2008, 10:52 39322

    Asynchronous calls

    Καλημερίζω την παρέα.

    Στην εργασία μου, έχουμε γράψει μια εφαρμογή (VB.NET, framework 2.0, MSSQL 2005), στην οποία, ένα Web Service καλεί ένα vb6 dll και αφού ανταλλάξει μαζί του πληροφορίες εξάγει κάποια αποτελέσματα. Θα θέλαμε όμως, αυτά τα calls στο vb6 dll να γίνονται ασύγχρονα.

    Θα ήθελα λοιπόν, να μου δώσετε μερικά links για το πώς θα ξεκινήσω. Θα σας παρακαλέσω όπως, τα links αυτά, εκτός από την απαραίτητη θεωρεία να έχουν και κάποιο κώδικα να δω.

    Ευχαριστώ,
    Διαμάντης


    A wise man does not urinate against the wind Smile
  •  18-01-2008, 11:12 39323 σε απάντηση της 39322

    Απ: Asynchronous calls

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

    http://www.dotnetzone.gr/cs/blogs/mkelaiditis/pages/10156.aspx

    Χρειάζεσαι την περίπτωση #3


    Vir prudens non contra ventum mingit
  •  19-01-2008, 00:03 39344 σε απάντηση της 39323

    Απ: Asynchronous calls

    Νομίζω ότι και η #2 κάνει, χωρίς polling. Από τη στιγμή που μιλάμε για Web Service δεν πρόκειται να επιστραφεί σε όποιον το καλεί τίποτε μέχρι να τελειώσει η ασύγχρονη κλήση. Άνετα μπορεί να γίνει η κλήση στην BeginInvoke, να κάνουμε ό,τι άλλο θέλουμε στο κυρίως thread και τέλος να καλέσουμε την EndInvoke.

    Προσοχή όμως. H χρήση COM Interop σε Web Service έχει διάφορα προβλήματα, όπως περιγράφεται και στο http://support.microsoft.com/kb/325791/en-us . Τα πράγματα είναι πιο εύκολα όταν χρησιμοποιεί κανείς COM+ καθώς τότε βλέπει τα componets μέσω των Enterprise Services.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  20-01-2008, 15:42 39386 σε απάντηση της 39322

    Απ: Asynchronous calls

    Καλησπερίζω και πάλι την παρέα του DotNetZone.

    Νομίζω ότι πρέπει να γίνω πιο σαφής για να καταλάβετε ακριβώς τι θέλουμε να κάνουμε.

    Όπως είχα γράψει και στο αρχικό μου μήνυμα, έχουμε γράψει ένα Web Service το οποίο καλεί ένα vb6 dll και αφού ανταλλάξει μαζί του πληροφορίες εξάγει κάποια αποτελέσματα. Για την ακρίβεια, στο vb6 dll σετάρουμε κάποιες μεταβλητές και αφού καλέσουμε μια function, αυτή σετάρει μια άλλη μεταβλητή (η οποία είναι ένα δισδιάστατο array). Να σημειώσω επίσης, ότι η function αυτή, ανάλογα με το πως θα σεταριστεί, κάνει από 0.3 έως 1 λεπτό να γυρίσει τα αποτελέσματα της.

    Τώρα, έχει παρουσιαστεί η ανάγκη να καλέσουμε αυτή την Function (μέχρι) 10 φορές. Σκεφτήκαμε λοιπόν, ότι αντί να την καλέσουμε 10 φορές σύγχρονα, να την καλέσουμε 10 φορές ασύγχρονα.

    Ψάχνω λοιπόν βιβλιογραφία και συμβουλές για το παραπάνω πρόβλημα. Έχεις κανείς κάτι υπόψιν του για να ξεκινήσω; Smile

    Διαμάντης


     


    A wise man does not urinate against the wind Smile
  •  20-01-2008, 16:53 39387 σε απάντηση της 39386

    Απ: Asynchronous calls

    Κοίταξες το άρθρο μου που σου πρότεινα; Απ' ό,τι περιγράφεις βρίσκει εφαρμογή στην περίπτωσή σου.


    Vir prudens non contra ventum mingit
  •  20-01-2008, 23:01 39400 σε απάντηση της 39386

    Απ: Asynchronous calls

    Ο Μανώλης έχει δίκιο, κοίτα πρώτα όσα σου έγραψε αλλά και το MSDN. Υπάρχουν πολλά άρθρα για threading, αν και στην περίπτωση σου η χρήση των delegates φαίνεται θα μπορούσε να βοηθήσει αλλά θα πρέπει να έχεις υπόψη τα προβλήματα που υπάρχουν στη χρήση VB6 από Web Services. Το multithreading δεν είναι εύκολη υπόθεση και θέλει διάβασμα. Δεν μπορείς να πάρεις μία έτοιμη λύση και να περιμένεις να λυθεί το πρόβλημα σου έτσι απλά. Για παράδειγμα, θα πρέπει να δημιουργήσεις ένα ξεχωριστό VB6 αντικείμενο για κάθε thread, καθώς η VB6 δεν φτιάχτηκε για να επιτρέπει ταυτόχρονες κλήσεις στο ίδιο αντικείμενο.

    Είσαι σίγουρος ότι τα πράγματα θα πάνε πιο γρήγορα? Γιατί καθυστερεί το function? Μήπως μπλοκάρει στη βάση? Κάνει περίεργους υπολογισμούς σε loop? Κάτι άλλο? (Πες μου τώρα ότι η εφαρμογή σου είναι και χρηματιστηριακή!). Αν η εφαρμογή μπλοκάρει στη βάση, τα περισσότερα threads θα χειροτερέψουν την κατάσταση καθώς θα προκαλέσουν χειρότερο μπλοκάρισμα. Αν η εφαρμογή χρησιμοποιεί πολύ CPU μπορείς να επιταχύνεις τη διαδικασία αν δημιουργήσεις ένα thread ανά επεξεργαστή. Δεν έχει κανένα απολύτως νόημα να χρησιμοποιείς 10 thread όταν έχεις μόνο 1 επεξεργαστή.

    Μετά σκέψου και το άλλο. Ένα web service δεν καλείται από ένα και μόνο client. Το VB6 dll σου μπορεί να καλείται ήδη από 10 διαφορετικούς client. Όπως είναι τώρα τα πράγματα, για 10 clients το dll καλείται 10 φορές ταυτόχρονα. Αν φτιάξεις 10 threads, το dll θα εκτελείται 100 φορές ταυτόχρονα. Ακόμα και αν το dll δεν χρησιμοποιεί καθόλου τη βάση, είμαι σίγουρος ότι δεν έχεις 100 CPU στο μηχάνημα σου. Για τον ίδιο αριθμό CPU θα έχεις αυξήσει την καθυστέρηση λόγω thread switching χωρίς αντίστοιχη βελτίωση στην ταχύτητα.

    Αν ο λόγος που καθυστερεί το function είναι κακός προγραμματισμός είτε σε επίπεδο VB6 ή στη βάση, θα καταφέρεις πολύ καλύτερα αποτελέσματα, πολύ ευκολότερα, διορθώνοντας τον προβληματικό κώδικα. Για παράδειγμα, μπορεί να έχεις ένα loop μέσα στο οποίο υπολογίζεται συνέχεια το ίδιο πράγμα. Αν βγάλεις αυτό το κομμάτι του υπολογισμού έξω από το loop θα πετύχεις σημαντική αύξηση ταχύτητας. Άλλος λόγος για σημαντική καθυστέρηση είναι η χρήση cursor στη βάση, ή η χρήση recordsets με client ή server side cursors. Θα πετύχεις πολύ μεγαλύτερη αύξηση στην ταχύτητα αν χρησιμοποιήσεις disconnected recordsets και stored procedures.

    Πριν από καιρό χρειάστηκε να αντιμετωπίσω μία τέτοια κακογραμμένη εφαρμογή. Η εφαρμογή υπολόγιζε αποδόσεις χαρτοφυλακίων και ήθελε 4 ημέρες να επεξεργαστεί όλα τα δεδομένα. Ένας από τους λόγους ήταν η χρήση cursors και recordsets. Ο άλλος ήταν ότι ο υπολογισμός της τιμής κάθε τίτλου (π.χ. μετοχής, αμοιβαίου, ομολόγου) γίνονταν ανά πελάτη, τίτλο και ημερομηνία. Όμως, ο υπολογισμός ανά τίτλο έφερνε το ίδιο αποτέλεσμα για όλους τους πελάτες την ίδια ημερομηνία. Ουσιαστικά η τιμή του τίτλου υπολογιζόταν χωρίς λόγο μερικές χιλιάδες φορές.
    Αλλάζοντας τον τρόπο υπολογισμού των τίτλων και αντικαθιστώντας το 80% του κώδικα που χρησιμοποιούσε recordsets ο χρόνος υπολογισμού έπεσε στις 2-4 ώρες.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  21-01-2008, 01:53 39414 σε απάντηση της 39400

    Απ: Asynchronous calls

    Παναγιώτης Καναβός:
    Ο Μανώλης έχει δίκιο, κοίτα πρώτα όσα σου έγραψε αλλά και το MSDN.

    Έχω ήδη εκτυπώσει το κείμενο που μου έδωσε και έχω επίσης ρίξει και αρκετό διάβασμα το σκ. Νομίζω ότι από αύριο θα αρχίσω τα πρώτα μου test Smile

    Παναγιώτης Καναβός:
    Το multithreading δεν είναι εύκολη υπόθεση και θέλει διάβασμα. Δεν μπορείς να πάρεις μία έτοιμη λύση και να περιμένεις να λυθεί το πρόβλημα σου έτσι απλά. Για παράδειγμα, θα πρέπει να δημιουργήσεις ένα ξεχωριστό VB6 αντικείμενο για κάθε thread, καθώς η VB6 δεν φτιάχτηκε για να επιτρέπει ταυτόχρονες κλήσεις στο ίδιο αντικείμενο.

    Ναι, θα συμφωνήσω απόλυτα με αυτά που λες. Και ερχόμαστε σε αυτό που λες στην συνέχεια....

    Παναγιώτης Καναβός:
    Είσαι σίγουρος ότι τα πράγματα θα πάνε πιο γρήγορα?

    Όχι, νομίζω ότι τελικά δεν θα κερδίσουμε τίποτα! Sad

    Παναγιώτης Καναβός:
    Γιατί καθυστερεί το function? Μήπως μπλοκάρει στη βάση? Κάνει περίεργους υπολογισμούς σε loop? Κάτι άλλο? (Πες μου τώρα ότι η εφαρμογή σου είναι και χρηματιστηριακή!).

    Όχι, δεν είναι χρηματιστηριακή. Smile Γιατί αργεί η εφαρμογή; Χμ.... Τα loops είναι σίγουρα ένας λόγος! Ένας άλλος λόγος είναι ότι αυτό το dll με την σειρά του καλεί ένα άλλο activeX exe το οποίο είναι και αυτό πολύ αργό (remote automation, rdo κτλ κτλ). Δυστυχώς όμως, δεν μπορώ να παρέμβω σε αυτά τα προγράμματα, αλλά ούτε και στην βάση.

    Διαμάντης

     


    A wise man does not urinate against the wind Smile
  •  22-01-2008, 12:42 39463 σε απάντηση της 39323

    Απ: Asynchronous calls

    KelMan:

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

    http://www.dotnetzone.gr/cs/blogs/mkelaiditis/pages/10156.aspx

    Χρειάζεσαι την περίπτωση #3

    Μετά από αρκετά πειράματα και διάβασμα, μπορώ να πω ότι έχω τα πρώτα πολύ ικανοποιητικά αποτελέσματα!!!! Ευχαριστώ! Smile

     


    A wise man does not urinate against the wind Smile
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems