Come utilizzare il multi-threading con le attività in C #

Il termine di programmazione del computer "thread" è l'abbreviazione di thread di esecuzione, in cui un processore segue un percorso specificato attraverso il codice. Il concetto di seguire più di un thread alla volta introduce il tema del multi-tasking e del multi-threading.

Un'applicazione contiene uno o più processi. Pensa a un processo come a un programma in esecuzione sul tuo computer. Ora ogni processo ha uno o più thread. Un'applicazione di gioco potrebbe avere un thread per caricare risorse dal disco, un'altra per eseguire l'intelligenza artificiale e un'altra per eseguire il gioco come server.

In .NET / Windows, il sistema operativo alloca il tempo del processore a un thread. Ogni thread tiene traccia dei gestori delle eccezioni e della priorità con cui viene eseguito e ha un posto in cui salvare il contesto del thread fino a quando non viene eseguito. Il contesto del thread è l'informazione che il thread deve riprendere.

Multi-tasking con discussioni

I thread occupano un po 'di memoria e la loro creazione richiede un po' di tempo, quindi di solito non vuoi usarne molti. Ricorda, competono per il tempo del processore. Se il tuo computer ha più CPU, Windows o .NET potrebbero eseguire ogni thread su una CPU diversa, ma se più thread vengono eseguiti sulla stessa CPU, solo uno può essere attivo alla volta e il passaggio dei thread richiede tempo.

La CPU esegue un thread per qualche milione di istruzioni, quindi passa a un altro thread. Tutti i registri della CPU, l'attuale punto di esecuzione del programma e lo stack devono essere salvati da qualche parte per il primo thread e quindi ripristinati da qualche altra parte per il thread successivo.

Creare una discussione

Nel sistema dello spazio dei nomi. Threading, troverai il tipo di thread. Il thread del costruttore (ThreadStart) crea un'istanza di un thread. Tuttavia, nel recente codice C #, è più probabile che passi un'espressione lambda che chiama il metodo con qualsiasi parametro.

Se non sei sicuro delle espressioni lambda, potrebbe valere la pena dare un'occhiata a LINQ.

Ecco un esempio di thread creato e avviato:

utilizzando il sistema;
utilizzando System.Threading;
spazio dei nomi ex1

programma di classe

vuoto statico pubblico Write1 ()

Console.Write ('1');
Thread.Sleep (500);

void statico Main (string [] args)

var task = new Thread (Write1);
task.Start ();
per (var i = 0; i < 10; i++)

Console.Write ('0');
Console.Write (task.IsAlive? 'A': 'D');
Thread.Sleep (150);

Console.ReadKey ();


Tutto questo esempio fa è scrivere "1" sulla console. Il thread principale scrive uno "0" sulla console 10 volte, ogni volta seguito da un "A" o "D" a seconda che l'altro thread sia ancora vivo o morto.

L'altro thread viene eseguito una sola volta e scrive un "1." Dopo il ritardo di mezzo secondo nel thread Write1 (), il thread termina e Task.IsAlive nel ciclo principale ora restituisce "D."

Libreria parallela di pool di thread e attività

Invece di creare il tuo thread, a meno che tu non abbia davvero bisogno di farlo, usa un pool di thread. Da .NET 4.0, abbiamo accesso alla Task Parallel Library (TPL). Come nell'esempio precedente, ancora una volta abbiamo bisogno di un po 'di LINQ, e sì, sono tutte espressioni lambda.

Attività utilizza il pool di thread dietro le quinte, ma utilizza meglio i thread in base al numero in uso.

L'oggetto principale nel TPL è un'attività. Questa è una classe che rappresenta un'operazione asincrona. Il modo più comune per avviare le cose è con Task.Factory.StartNew come in: