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

 

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

Ταυτόχρονη κλήση και εκτέλεση μεθόδων - Γίνεται;;

Îåêßíçóå áðü ôï ìÝëïò zekia. Τελευταία δημοσίευση από το μέλος zekia στις 02-10-2007, 21:46. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-10-2007, 02:14 35715

    Ταυτόχρονη κλήση και εκτέλεση μεθόδων - Γίνεται;;

    Φτιάχνω μια μεταμηχανή αναζήτησης σαν εργασία.
    Αυτό που θέλω να κάνω είναι να στέλνω ταυτόχρονα requests προς άλλες μηχανές, ωστε να λάβω τα αποτελέσματά τους, και όχι πρώτα στη μια και μετά στην άλλη.
    Υπάρχει κάποιος συγκεκριμένος μηχανισμός ή κάποια συγκεκριμένη μεθοδολογία που θα 'πρεπε να ακολουθήσω;
    Μάλλον φάινεται αρκετά γενική η ερώτηή μου, όμως θα θελα να πάρω κάποιες ιδέες.
  •  02-10-2007, 05:29 35719 σε απάντηση της 35715

    Απ: Ταυτόχρονη κλήση και εκτέλεση μεθόδων - Γίνεται;;

    Μάλλον χρειάζεσαι ένα multithreading solution.

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

    Το .Net έχει build-in support για multithreading μέσω της System.Threading.

    Πες μας τι ακριβώς θέλεις να κάνεις για να δω τι μεθοδολογία μπορείς να χρησιμοποιήσεις.

    New Yorker.


    Στέφανος
    New Yorker
  •  02-10-2007, 08:18 35723 σε απάντηση της 35719

    Απ: Ταυτόχρονη κλήση και εκτέλεση μεθόδων - Γίνεται;;

    Ακόμα καλύτερη λύση είναι να εκτελέσεις τα queries προς τις άλλες μηχανές ασύγχρονα. Η κλάση HttpWebRequest έχει τη μέθοδο BeginGetResponse για να καλέσει ένα άλλο web site χωρίς να μπλοκάρει και να επιστρέψει άμεσα χωρίς να περιμένει τα αποτελέσματα. Όταν τα αποτελέσματα φτάσουν, η ίδια η BeginGetResponse θα καλέσει μία μέθοδο που θα της έχεις ήδη δώσει για να επεξεργαστεί τα δεδομένα. Το documenation της BeginGetResponse περιέχει ένα παράδειγμα με όλα τα βήματα. Με τον τρόπο αυτό δεν χρειάζεται να χειριστείς εσύ ο ίδιος τα threads.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-10-2007, 10:51 35728 σε απάντηση της 35723

    Απ: Ταυτόχρονη κλήση και εκτέλεση μεθόδων - Γίνεται;;

    Μέχρι στιγμής έχω υλοποιήσει το εξής: όταν ο χρήστης πατά το κουμπί αναζήτησης καλείται μια μέθοδος η οποία δημιουργεί τα κατάλληλα urls για κάθε μηχανή, τα στέλνει σειριακά με web requests και λαμβάνει τα αποτελέσματα σε streams δεδομένων:

              string Α_url;
              string B_url;
              string C_url;

            WebRequest requestA = WebRequest.Create(Α_url);
            WebRequest requestB = WebRequest.Create(B_url);
            WebRequest requestC = WebRequest.Create(C_url);
          
            HttpWebResponse responseA = (HttpWebResponse)requestA.GetResponse();
            HttpWebResponse responseB = (HttpWebResponse)requestB.GetResponse();
            HttpWebResponse responseC = (HttpWebResponse)requestC.GetResponse();
           
            Stream dataStreamA = responseA.GetResponseStream();
            Stream dataStreamB = responseB.GetResponseStream();
            Stream dataStreamC = responseC.GetResponseStream();
           
            StreamReader readerA = new StreamReader(dataStreamA);
            StreamReader readerB = new StreamReader(dataStreamB);
            StreamReader readerC = new StreamReader(dataStreamC);
           
            string responseA = readerA.ReadToEnd();
            string responseB = readerB.ReadToEnd();
            string responseC = readerC.ReadToEnd();


    Στη συνέχεια τα responseA, responseB και responseC στέλνονται προς επεξεργασία σε άλλες μεθόδους, ωστε να ξεχωρίσω το περιεχόμενο που με ενδιαφέρει απο αυτά.

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

    Ελπίζω να σας έδωσα μια πιο καθαρή εικόνα.


  •  02-10-2007, 10:58 35731 σε απάντηση της 35728

    Απ: Ταυτόχρονη κλήση και εκτέλεση μεθόδων - Γίνεται;;

    Κοίταξες την BeginGetResponse? Κάνει αυτό που θέλεις, και περιέχει sample κώδικα στο documentation.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-10-2007, 15:43 35747 σε απάντηση της 35731

    Απ: Ταυτόχρονη κλήση και εκτέλεση μεθόδων - Γίνεται;;

    Λοιπόν μελέτησα κάποια πράγματα για την BeginGetResponse.
    Ο παραπάνω κώδικας θα πρέπει να μετασχηματιστεί έτσι;

    ---------------------------------------------------------------------------------------------------------------
              string Α_url;
              string B_url;
              string C_url;

            HttpWebRequest requestA = HttpWebRequest.Create(A_url);
            HttpWebRequest requestB = HttpWebRequest.Create(B_url);
            HttpWebRequest requestC = HttpWebRequest.Create(C_url);

            requestA.BeginGetRequestStream(new AsyncCallback(A_ReadCallback), requestA);
            requestB.BeginGetRequestStream(new AsyncCallback(B_ReadCallback), requestB);
            requestC.BeginGetRequestStream(new AsyncCallback(C_ReadCallback), requestC);

            HttpWebResponse responseA = (HttpWebResponse)requestA.GetResponse();
            HttpWebResponse responseB = (HttpWebResponse)requestB.GetResponse();
            HttpWebResponse responseC = (HttpWebResponse)requestC.GetResponse();
           
            Stream dataStreamA = responseA.GetResponseStream();
            Stream dataStreamB = responseB.GetResponseStream();
            Stream dataStreamC = responseC.GetResponseStream();
           
            StreamReader readerA = new StreamReader(dataStreamA);
            StreamReader readerB = new StreamReader(dataStreamB);
            StreamReader readerC = new StreamReader(dataStreamC);
           
            string responseA = readerA.ReadToEnd();
            string responseB = readerB.ReadToEnd();
            string responseC = readerC.ReadToEnd();

    ---------------------------------------------------------------------------------------------------------------

    και προστίθενται τρεις διαφορετικές μέθοδοι ReadCallback όπως:

    ---------------------------------------------------------------------------------------------------------------

    private static void Α_ReadCallback(IAsyncResult asynchronousResult) {
          
           HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
           Stream postStream = request.EndGetRequestStream(asynchronousResult);

    }

    ---------------------------------------------------------------------------------------------------------------
    θα ήθελα να μου πεις αν το έχω κάνει σωστά....
    Σας ευχαριστώ πάρα πολύ για τη βοήθεια μέχρι στιγμής:)
  •  02-10-2007, 21:46 35763 σε απάντηση της 35747

    Απ: Ταυτόχρονη κλήση και εκτέλεση μεθόδων - Γίνεται;;

    Επειδή βγαίναν κάποια άγνωστα σφάλματα στον παραπάνω κώδικα, πρόσθεσα και κάποι άλλα. Δυστυχώς όμως στην μαρκαρισμένη γραμμή εμφανίζεται σφάλμα "The server committed a protocol violation. Section=ResponseHeader Detail=Header name is invalid"
    κάτι που δεν ξέρω τι σημαίνει.... βοήθεια κανείς;


             string Α_url;
              string B_url;
              string C_url;

            HttpWebRequest requestA = HttpWebRequest.Create(A_url);
            HttpWebRequest requestB = HttpWebRequest.Create(B_url);
            HttpWebRequest requestC = HttpWebRequest.Create(C_url);

            requestA.ContentType = "application/x-www-form-urlencoded";

            requestB.ContentType = "application/x-www-form-urlencoded";
            requestC.ContentType = "application/x-www-form-urlencoded";

            requestA.Method = "POST";
            requestB.Method = "POST";
            requestC.Method = "POST";

            requestA.BeginGetRequestStream(new AsyncCallback(A_ReadCallback), requestA);
            requestB.BeginGetRequestStream(new AsyncCallback(B_ReadCallback), requestB);
            requestC.BeginGetRequestStream(new AsyncCallback(C_ReadCallback), requestC);

            HttpWebResponse responseA = (HttpWebResponse)requestA.GetResponse();
            HttpWebResponse responseB = (HttpWebResponse)requestB.GetResponse();
            HttpWebResponse responseC = (HttpWebResponse)requestC.GetResponse();
           
            Stream dataStreamA = responseA.GetResponseStream();
            Stream dataStreamB = responseB.GetResponseStream();
            Stream dataStreamC = responseC.GetResponseStream();
           
            StreamReader readerA = new StreamReader(dataStreamA);
            StreamReader readerB = new StreamReader(dataStreamB);
            StreamReader readerC = new StreamReader(dataStreamC);
           
            string responseA = readerA.ReadToEnd();
            string responseB = readerB.ReadToEnd();
            string responseC = readerC.ReadToEnd();
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems