Programmazione parallela con Visual Studio in C#

Chissà quante volte avrai sentito parlare di programmazione parallela ma, forse nessuno ti ha mai messo nelle condizioni di capire bene di cosa si tratta e di come implementarla, ad esempio, scrivendo un semplicissimo pezzo di codice con Visual Studio in C#. Prima di iniziare, come avrai capito, abbiamo bisogno di Visual Studio, L’IDE per lo sviluppo di Microsoft che puoi scaricare a questo indirizzo. Ad ogni modo se vuoi vedere come scaricare e installare Visual Studio, fai riferimento a questo video tutorial, dove avrai modo di vedere passo-passo come farlo.

1. Crea un progetto Console Application in C# con Visual Studio

Dopo aver scaricato e installato Visual Studio puoi iniziare a creare il tuo primo progetto Console in C#. Un Progetto Console è un’applicazione priva delle classiche finestre grafiche, visto e considerato che il codice che metteremo in esecuzione ci servirà solo per capire come funziona la programmazione parallela sfruttando una classe di C#, la classe Parallel e richiamando uno dei suoi tre metodi, cioè, il metodo Invoke.

Quindi a tal proposito, clicca su File -> New -> Project, e, nel campo Name, digita il nome del progetto, cioè, ParallelProgrammming. Successivamente clicca sul pulsante “Ok“.

crea nuovo progetto visual studio in c#

2. Un esempio di Programmazione Parallela

Copia e incolla la porzione di codice seguente all’interno della finestra dell’editor di codice mostrata da Visual Studio dopo la fase di creazione del progetto.

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ParallelProgramming
{
    class Program
    {
        static void Main(string[] args)
        {
            Parallel.Invoke(
                    () => DoSomeTask(1),
                    () => DoSomeTask(2),
                    () => DoSomeTask(3),
                    () => DoSomeTask(4),
                    () => DoSomeTask(5),
                    () => DoSomeTask(6),
                    () => DoSomeTask(7)
                );
            Console.ReadKey();
        }

        static void DoSomeTask(int number)
        {
            Console.WriteLine($"DoSomeTask {number} started by Thread {Thread.CurrentThread.ManagedThreadId}");
            //Attendi 5 secondi
            Thread.Sleep(5000);
            Console.WriteLine($"DoSomeTask {number} completed by Thread {Thread.CurrentThread.ManagedThreadId}");
        }
    }
}

Dopo di che il gioco è fatto, esegui l’applicazione cliccando sul pulsante con l’icone raffigurante una freccia verde e, goditi il tuo primo programma in esecuzione parallela.

eseguire un'applicazione console con visual studio in c#

3. Cosa funziona la classe Parallel e il metodo Invoke

Innanzitutto avrai senz’altro notato che questa applicazione funziona all’interno della classica finestra associata al prompt dei comandi di Windows. Sì, in effetti, questa è la caratteristica che ha un’applicazione Console. Molto utile per provare comandi e procedure con un sistema più immediato e sfruttando il minimo delle risorse.

applicazione console in esecuzione

Dopo di che passiamo a descrivere nel dettaglio il codice. Dando una rapida occhiata al codice relativo alle righe con la clausola using, si capisce che la classe Parallel sfrutta uno dei meccanismi più potenti della programmazione, e cioè, i Tasks.

Se non hai mai sentito parlare di Task, posso solo dirti che è uno dei sistemi più immediati per l’esecuzione di codice parallelo o asincrono, il cosiddetto Multitasking.

Cioè, eseguire un metodo, o più istruzioni, più volte e contemporaneamente. In sostanza il trucco è tutto all’interno della chiamata del metodo Invoke della classe statica Parallel.

Quando senti parlare di oggetti statici, si fa riferimento ad oggetti che per essere utilizzati non devono necessariamente essere prima istanziati. Infatti, la chiamata avviene richiamando direttamente il metodo Invoke senza istanziare nessun oggetto.

Il metodo Invoke non fa altro che accettare come parametri uno o più metodi, potrebbe essere anche lo stesso metodo, e in fase di esecuzione crea automaticamente dei Tasks che eseguono in modalità parallela, tutti i metodi passati a Invoke.

L’esecuzione parallela di codice ha la caratteristica che non occorre necessariamente attendere la fine dell’esecuzione della chiamata del primo metodo per eseguire il secondo e così via. Pertanto, l’esecuzione di tutti i metodi passati a Invoke vengono eseguiti in modalità asincrona. Per cui dopo l’esecuzione del metodo Invoke, il controllo passa immediatamente alla riga di codice successiva a Invoke.


LEGGI ANCHE: Come creare la tua prima Web Application con Microsoft Visual Studio


4. Conclusioni

Questo tipo di programmazione, agevola moltissimo l’esecuzione di codice parallelo. Tempo fa per eseguire lo stesso codice era necessario istanziare più oggetti di tipo Thread e gestirne le funzionalità in modo esplicito.

Ad ogni modo per eseguire attività multiple in modalità asincrona, quale potrebbero essere ad esempio, il salvataggio di dati in background, esattamente quello che fa Word mentre scriviamo una lettera, il metodo Invoke rappresenta la soluzione ottimale e meno dispendiosa per eseguire questa tipologia di processi.

Oltre al metodo invoke, la classe Parallel espone altri due metodi, uno e For e l’altro è Foreach. Con entrambi questi metodi puoi eseguire dei cicli paralleli in modalità asincrona. Anche questo tipo di soluzione, a volte, rappresenta una soluzione ottimale per scansionare variabili o liste simultaneamente.

Task Parallel Library

LEGGI ANCHE: Come creare il tuo primo programma in C++ con Qt Creator


Antonio Lamorgese

Amministratore di rete e sviluppatore. Dopo anni di esperienza nel settore, ho ideato un sistema di gestione dati MYSQL in PHP senza scrivere una sola riga di codice. Scopri di più....