- Introduzione a al multi-threading
in .Net -
|
|||
COSA SERVE PER QUESTO TUTORIAL | |||
Download | Chiedi sul FORUM | Glossario | conoscenza base di VB .Net e dei concetti di processo e thread | ||
Come funzionano i thread in VB .Net | |||
HARDWARE, PROCESSI E THREAD Cosa sono e perché sono importanti i thread
Da alcuni anni a questa parte lo sviluppo dei processori ha, per
svariati motivi, imboccato la via dell'aumento del numero di core o
processori più che delle prestazioni di un singolo di essi. Questo porta
alcuni vantaggi e altri svantaggi; il principale problema è che la
maggior parte dei programmi attualmente in circolazione è stato
sviluppato per funzionare per un singolo processore, e di conseguenza ci
si ritrova spesso nella frustrante situazione di avere un processore
completamente utilizzato e un altro del tutto a riposo. Un uso
consapevole e ben calibrato della tecnica del multi-threading può
ovviare a questo problema. Ovviamente utilizzare più thread allo stesso
tempo ha molti altri fini oltre a quello di sfruttare più core allo
stesso tempo, ma, soprattutto oggi, è certamente importante sottolineare
anche questo aspetto. Il namespace System.Threading e le classi per il multi-threading
In .Net ci si può servire della tecnica del multi-threading in due modi:
creando direttamente un thread tramite la classe Thread (in
System.Threading) oppure servendosi del ThreadPool (altra
classe di System.Threading). Un thread andrebbe utilizzato per
operazioni che richiedono un notevole quantitativo di tempo mentre un
ThreadPool è adatto per eseguire in maniera asincrona compiti di
breve durata. Ogni volta che si effettua una chiamata asincrona del tipo
BeginRead, BeginInvoke e così via si sfrutta
implicitamente il ThreadPool, ovvero un thread che esegue man
mano una coda di operazioni. Si badi che il ThreadPool è
utilizzato anche dal framework per eseguire operazioni interne asincrone
ed è quindi bene non sovraccaricarlo di richieste di lunga durata. Dim thrDownloader As New Thread(AddressOf DownloadURL) thrDownloader.Start(strURL) Si tratta semplicemente di istanziare la classe Thread passando come parametro l'indirizzo di una funzione da richiamare (tramite l'operatore AddressOf). Questa funzione deve essere una Sub la cui firma (ovvero tipo restituito e parametri accettati) corrisponda a quella di uno dei due delegati che il costruttore accetta, ovvero ThreadStart o ParametrizedThreadStart: Public Delegate Sub ThreadStart() Public Delegate Sub ParameterizedThreadStart(ByVal obj As Object) Il primo è semplicemente una Sub che non riceve alcun parametro,
mentre la seconda, come dice il nome, accetta un parametro Object
che permette di comunicare con il thread appena creato. In questo caso
noi ci siamo serviti di un ParameterizedThreadStart, come vedremo
tra poco. Public Sub DownloadURL(ByVal URL As Object) Dim wrqRequest As Net.HttpWebRequest = CType(Net.HttpWebRequest.Create(URL.ToString()), _ Net.HttpWebRequest) Dim wrsResponse As Net.HttpWebResponse Try wrsResponse = CType(wrqRequest.GetResponse(), Net.HttpWebResponse) Catch exc As Net.WebException wrsResponse = CType(exc.Response, Net.HttpWebResponse) End Try Console.WriteLine(String.Format("{0}: {1} - {2}", URL, wrsResponse.StatusCode.ToString("d"), _ wrsResponse.StatusDescription)) wrsResponse.Close() End Sub Si tratta di una semplice Sub che prende come parametro un
URL, effettua una richiesta, stampa sulla console il responso dato
dal server (anche in caso di errore) e infine termina la richiesta. Il bello deve ancora venire. Se si testa l'applicazione più
volte si potrà vedere che l'ordine dei risultati può variare di volta in
volta a seconda dei tempi di risposta dei vari server, nonostante le
richieste vengano eseguite sempre nello stesso ordine: questo ci fa
capire che l'esecuzione è davvero parallela (asincrona) e non
sequenziale (sincrona). Ovviamente era possibile ottenere lo stesso
risultato senza creare alcun thread ma sfruttando le chiamate asincrone
di HttpWebRequest (come BeginGetResponse, che
implicitamente si servono del ThreadPool), ma abbiamo in questo
modo reso l'idea di cosa può fare e come funziona un thread.
|
|||
<< INDIETRO | by VeNoM00 |