Date le capacità dei computer attuali, capita spesso di trovarsi a parallelizzare una serie di operazioni, attendere che queste abbiano concluso, lavorare sul risultato e restituirlo. Fare tutto questo non è però banale, perché richiede l'utilizzo di più thread (per eseguire più operazioni concorrenti) e attendere che questi abbiano finito, ma fortunatamente viene in aiuto la Task Parallel Library che semplifica notevolmente la realizzazione di questi scenari.
Ipotizzando di voler scaricare più pagine HTML con richieste HTTP, la TPL offre dei metodi di factory per rappresentare i Task che vogliamo eseguire. Una volta definiti, questi possono essere avviati o relazionati con altri task. Nello snippet seguente si crea un task per ogni WebRequest da utilizzare per effettuare la richiesta HTTP; attraverso poi Task.WaitAll si avvia e si attende che questi vengano eseguiti.
// Lista degli uri da caricare
Uri[] uris = new Uri[] {
    new Uri("https://www.winfxitalia.com"),
    new Uri("https://www.aspitalia.com")
};
List<Task<WebResponse>> tasks = new List<Task<WebResponse>>();
foreach (Uri u in uris)
{
    // Preparo la richiesta HTTP da fare
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(u);
    request.UserAgent = "Test";
    // Rappresento il task di avvio della richiesta
    Task<WebResponse> task = Task.Factory.FromAsync((c, s) => request.BeginGetResponse(c, s), ar => request.EndGetResponse(ar), TaskCreationOptions.LongRunning);
    tasks.Add(task);
}
// Eseguto e aspetto che tutti i task abbiano finito
Task.WaitAll(tasks.ToArray());
WebResponse[] response = tasks.Select(t => t.Result).ToArray();Il factory method FromAsync permette di rappresentare operazioni che rispettano il pattern Begin/End, ma è possibile anche passare una normale funzione sincrona. L'esempio può essere ampliato facendo in modo che, dopo l'esecuzione di ogni task, ne venga eseguito uno che gestisca i risultati e restituisca l'HTML di ogni richiesta. Il metodo ContinueWhenAll soddisfa questa esigenza, permettendo di passare il delegate da eseguire per processare il risultato.
Task htmlTask = Task.Factory.ContinueWhenAll<WebResponse, String[]>(tasks.ToArray(), DownloadFinished);
htmlTask.Wait();
string[] html = htmlTask.Result;
static String[] DownloadFinished(Task<WebResponse>[] tasks)
{
    return tasks.Select(t =>
    {
        using (Stream s = t.Result.GetResponseStream())
        {
            return new StreamReader(s).ReadToEnd();
        }
    }).ToArray();
}E' importante notare che i task vengono eseguiti secondo le logiche dello scheduler, su thread secondari, a seconda dei carichi della macchina, dei tempi di risposta delle richieste e della capacità della CPU. Non si può prevedere con esattezza quante richieste in parallelo effettua, ma si può contare sul fatto che lo scheduler tende a sfruttare al massimo le capacità della macchina.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
- Disabilitare le run concorrenti di una pipeline di Azure DevOps
- Recuperare App Service cancellati su Azure
- Controllare la telemetria con .NET Aspire
- Aggiornare a .NET 9 su Azure App Service
- Change tracking e composition in Entity Framework
- Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
- Gestire il routing HTTP in Azure Container App
- Utilizzare Intersect e Except per filtrare set di dati in TSql
- Conoscere il rendering Server o WebAssembly a runtime in Blazor
- Eseguire script pre e post esecuzione di un workflow di GitHub
- Utilizzare DeepSeek R1 con Azure AI
- Utilizzare l'espressione if inline in una pipeline di Azure DevOps
I più letti di oggi
- CSS Friendly Toolkit per ASP.NET 2.0 Beta 1, per migliorare il supporto agli standard web
- Occhio alle bufale: Microsoft non invia patch via e-mail!
- Nuova build di IE 7 beta 2 preview con la March 20 Refresh
- CSS Friendly ASP.NET 2.0 Control Adapters Beta 3
- Pubblicare un MCP Server in GitHub MCP Registry
- WinPhoneItalia.com: dal 15 settembre tutto per sviluppare per Windows Phone e mobile
- IIS guadagna ancora terreno
- Adattare le immagini in base alla pixel density con HTML5 e CSS3


