Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C#] Eseguire contemporaneamente più thread

    Salve,
    ho fatto un piccolo script Console Multithread per fare un parser su una pagina Html, ed estrarre tutti i link con class="pippo".

    codice:
            public static void Main()
            {
                Thread t;
    
    
                for (int i = 0; i <= 10; i++)
                {
                    DataThread data = new DataThread();
    
    
                    t = new Thread(new ParameterizedThreadStart(TestThread));
    
    
                    t.Start();
                }
    
    
                Console.ReadLine();
            }
    
    
    
            public static void TestThread(object data)
            {
                HtmlWeb htmlWeb = new HtmlWeb();
                string sUrl = "";
    
    
                HtmlDocument doc = htmlWeb.Load("https://www.pagina.com");
    
    
                foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//a[@class='pippo']"))
                {
                    sUrl = node.Attributes["href"].Value;
    
    
                    if (sUrl != "")
                    {
                        Console.Write(sUrl  + "\n");
                    }
                }
    Lo eseguo, funziona tutto, solamente che esegue un thread alla volta, non partono tutti e 10 contemporaneamente.

    Io vorrei lanciare 10 richieste http e poi il tempo che impiega ciascuna per terminare sono affari suoi, non mi deve bloccare l'esecuzione del prossimo thread e cioè della richiesta http.

    Come posso fare ?

    Grazie molte a tutti.

  2. #2

  3. #3
    Scusate, uso C#

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da w_t Visualizza il messaggio
    Lo eseguo, funziona tutto, solamente che esegue un thread alla volta, non partono tutti e 10 contemporaneamente.
    Qual è il modo con cui determini effettivamente quanti thread sono in esecuzione?

    Inoltre, fai uso del delegato ParameterizedThreadStart, però non passi nessun parametro al metodo Start().

    Il codice che viene eseguito è inoltre lo stesso per tutti i thread, dato che non usa nessun parametro, quindi in pratica i 10 thread che lanci fanno esattamente la stessa identica cosa.

    Prova a dare un'occhiata al codice che hai scritto, aiutandoti anche con la documentazione, perché i punti elencati qui sopra sono sospetti.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Quote Originariamente inviata da alka Visualizza il messaggio
    Qual è il modo con cui determini effettivamente quanti thread sono in esecuzione?

    Inoltre, fai uso del delegato ParameterizedThreadStart, però non passi nessun parametro al metodo Start().

    Il codice che viene eseguito è inoltre lo stesso per tutti i thread, dato che non usa nessun parametro, quindi in pratica i 10 thread che lanci fanno esattamente la stessa identica cosa.

    Prova a dare un'occhiata al codice che hai scritto, aiutandoti anche con la documentazione, perché i punti elencati qui sopra sono sospetti.

    Ciao!
    Si tutti fanno il solito lavoro ma con una modifica che avviene passando un parametro, qui ho tolto molta roba dallo script per fare un esempio chiaro, appena mi funziona questo esempio modifico e passo i parametri dovuti

    Vedo con Console.Write(sUrl +"\n"); quanti si aprono, e fino a che il primo non termina ilo secondo no si apre.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da w_t Visualizza il messaggio
    qui ho tolto molta roba dallo script per fare un esempio chiaro
    Se riporti un codice diverso da quello attuale, potrebbe essere difficile individuare il problema, soprattutto se si annida nella parte di codice che hai rimosso.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Quote Originariamente inviata da alka Visualizza il messaggio
    Se riporti un codice diverso da quello attuale, potrebbe essere difficile individuare il problema, soprattutto se si annida nella parte di codice che hai rimosso.
    No, il problema è proprio quì, anche questa piccola porzione richiama TestThreaduna dopo l'altra e non fa 10 chiamate contemporanee, ci si accorge benissimo, TestThread impiega 2 secondi a fare la chiamata alla pagina html, per aprirne 10 devo aspettare 20 secondi.

    Ti faccio un esempio,
    ho fatto come test una applicazione che richiama 200 volte un altra applicazione Console, la quale ultima fa la richiesta http alla pagina html, ti ricordi che impiega 2 secondi per la richiesta...

    Il risultato è che apre 200 Console in 3 secondi, poi ciascuna impiega 2 secondi per la chiamata http

    quindi: 2 + 2 = 4 secondi e ho fatto 100 richieste http, al contrario di prima che impiega 20 secondi

    Lo script finale impiega circa "6/8 secondi" a terminare, fa anche altre richieste http, non solo la principale, pensa se lo avvio per cercare su 1000 pagine quanto impiega:

    1000-chiamate x 8-secondi = 8000-secondi = (2,2 ore)

    Con il metodo a Console dell'esempio:

    1000-chiamate x 8-secondi = 8000-secondi / 200-console + 2-secondi-apertura-console = (10 minuti)


    Vorrei arrivare a questo con i Thread, senza chiamare un altro exe esterno al progetto.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da w_t Visualizza il messaggio
    Vorrei arrivare a questo con i Thread, senza chiamare un altro exe esterno al progetto.
    Ripeto e ribadisco: se non posti il codice, non è possibile capire cosa c'è che non va nella versione che fa le chiamate HTTP rispetto a quella che usa le Console esterne.

    Prova a costruire un prototipo semplificato di applicazione che riproduce l'effetto senza altri fronzoli e a postarlo in modo che chiunque lo possa testare, e vedrai che la causa salterà fuori.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Quote Originariamente inviata da alka Visualizza il messaggio
    Prova a costruire un prototipo semplificato di applicazione che riproduce l'effetto senza altri fronzoli e a postarlo in modo che chiunque lo possa testare, e vedrai che la causa salterà fuori.
    E' quello che ho postato il codice semplificato, è quello che da l'errore, se lo copi e incolli su una soluzione console ti darà il mio errore, in realta non è un errore ma si esegue in maniera non corretta.

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da w_t Visualizza il messaggio
    E' quello che ho postato il codice semplificato, è quello che da l'errore, se lo copi e incolli su una soluzione console ti darà il mio errore, in realta non è un errore ma si esegue in maniera non corretta.
    Il codice che hai postato è parziale: il corpo del metodo è visibilmente troncato.
    Inoltre, fai un uso errato del ParameterizedThreadStart, come indicato nella mia prima risposta.

    In breve, ci sono comunque già degli errori da correggere nel tuo codice per quello che si vede, mentre il resto manca.

    Magari la parte che manca non è significativa, magari invece fornisce l'indizio definitivo. E' chiaro che, a fronte del problema, se scrivi qui per segnalarlo e farti aiutare ed eviti di fare ciò che ti viene chiesto da parte di chi vuole darti una mano, non è che ti si possano dare chissà quali soluzioni.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.