Multithreading in C#: vantaggi, nozioni di base e best practice
Pubblicato: 2023-06-01Sommario
Che cos'è la programmazione multithread
Il multithreading è un concetto fondamentale nell'ingegneria del software. In C#, la programmazione multithread è essenziale per gli sviluppatori di software che lavorano con .NET Framework. Gli sviluppatori utilizzano ampiamente il multithreading in C# in quanto consente loro di creare applicazioni complesse e reattive in modo efficiente.
Questo blog fornisce una panoramica del multithreading c# mentre, allo stesso tempo, esamina anche come i programmatori possono creare e gestire facilmente i thread. Include anche i vantaggi dell'uso del multithreading e dei diversi modelli di threading disponibili in C#.
Benefici e vantaggi della programmazione multithread
Se eseguito contemporaneamente, il multithreading migliora l'efficacia delle applicazioni. I vantaggi più comuni del thread C# includono quanto segue:
- Prestazioni delle applicazioni migliorate: con l'aiuto del multithreading, le applicazioni vengono eseguite più velocemente con più attività in esecuzione nello stesso spazio.Nella sua totalità, riduce i tempi di esecuzione e lascia il posto a più attività.
- Aumento della velocità effettiva: il multitasking in C# migliora la velocità effettiva delle applicazioni.Quando due thread diversi vengono eseguiti contemporaneamente, è possibile risparmiare tempo e risorse.
- Reattività migliorata: con l'aiuto del multithreading, un utente può accedere al front-end dell'applicazione mentre il programma viene eseguito in background.
- Maggiore utilizzo delle risorse: il multithreading consente agli utenti di accedere alle risorse di sistema in modo più efficiente.Ad esempio, i thread possono condividere risorse come file, memoria e dispositivi I/O, aprendo la strada all'efficienza.
- Programmazione più accessibile: il multithreading consente una programmazione più semplice in quanto gli utenti possono scrivere i thread in modo indipendente.Consente inoltre agli utenti di eseguire il debug e testare le applicazioni in isolamento.
- Comunicazione ottimizzata: la sincronizzazione dei thread consente una migliore comunicazione da processo a processo.Può essere utilizzato per una comunicazione più accessibile tra i thread.
In primo luogo, riguarda i singoli oggetti che possono essere sincronizzati. In secondo luogo, può essere utilizzato con la classe System.Threading e Interlocked.
Concetti di base del multithreading in C#
Il multithreading consente agli utenti di eseguire più attività contemporaneamente con l'aiuto di più core del processore. Ecco i concetti di base utilizzati nel multithreading:
- Thread: i thread sono le unità di base nel multithreading che aiutano a eseguire un processo.Si tratta di percorsi di esecuzione all'interno di un determinato programma che possono essere eseguiti contemporaneamente ad altri thread.
In C# possiamo trovare due tipi di thread, vale a dire thread in primo piano e in background. La classe thread media include un nome, una priorità, isAlive, ThreadState, Start(), Suspend(), Resume() e Join().
- Pool di thread: un pool di thread è un thread che aiuta a eseguire le attività.Consente al sistema operativo di riutilizzare i thread esistenti e riduce al minimo il rischio di possibili sovraccarichi.
- Sincronizzazione: la sincronizzazione trascura l'accesso ad altri thread per più operazioni.È un processo essenziale per mantenere l'integrità dei dati e prevenire le spese generali.
- Deadlock: un deadlock è un errore che si verifica quando due thread condividono le risorse e tentano di procedere senza successo.Può causare il blocco del sistema o addirittura portare a un tempo di attesa.
- Programmazione asincrona: la programmazione asincrona consente di eseguire più attività in background consentendo al thread principale di funzionare senza interruzioni.Apre la strada a più interfacce utente reattive, migliorando le prestazioni delle applicazioni.
Creazione ed esecuzione di thread
La creazione e l'esecuzione possono essere più semplici con questi esempi. Di seguito viene fornito un esempio di multithreading in C# :
utilizzando il sistema;
usando System.Threading;
classe Programma {
vuoto statico Main() {
int indice lavoratore = 0;
Thread workerThread = new Thread(new ThreadStart(Worker));
workerThread.Start();
for (int mainIndex = 1; mainIndex <= 10; mainIndex++) {
Console.WriteLine("Thread principale: {0}", mainIndex);
Thread.Sleep(200);
}
workerThread.Join();
}
static void Lavoratore() {
for (int indicelavoratore = 1; indicelavoratore <= 10; indicelavoratore++) {
Console.WriteLine("Thread di lavoro: {0}", workerIndex * 2);
Thread.Sleep(200);
}
}
}
Produzione:
Filo principale: 1
Filo lavoratore: 2
Filo principale: 2
Filo lavoratore: 4
Filo principale: 3
Filo operaio: 6
Filo principale: 4
Filo operaio: 8
Filo principale: 5
Filo operaio: 10
Filo principale: 6
Filo operaio: 12
Filo principale: 7
Filo operaio: 14
Filo principale: 8
Filo operaio: 16
Filo principale: 9
Filo operaio: 18
Filo principale: 10
Filo operaio: 20
Spiegazione: in questo output, entrambi i thread lavorano contemporaneamente per stampare i numeri da 1 a 10 e da 2 a 20, quest'ultimo raddoppiato dall'indice del loop.In questo esempio è stato usato il metodo C# thread sleep (Thread.Sleep).
Allo stesso modo, esamineremo un altro esempio di thread C# utilizzando il thread in primo piano:
utilizzando il sistema;
usando System.Threading;
classe Programma {
vuoto statico Main() {
Thread myThread = new Thread(Lavoratore);
mioThread.Inizio();
Console.WriteLine("Thread principale: avviato");
for (int i = 1; i <= 5; i++) {
Console.WriteLine("Thread principale: Conte {0}", i);
Thread.Sleep(500);
}
Console.WriteLine(“Thread principale: terminato”);
}
static void Lavoratore() {
for (in j = 1; j <= 5; j++) {
Console.WriteLine("Worker Thread: Count {0}", j * 3);
Thread.Sleep(750);
}
Console.WriteLine("Thread di lavoro: terminato");
}
}
Produzione:
Discussione principale: iniziata
Thread di lavoro: contare 3
Discussione principale: conta 1
Thread di lavoro: conta 6
Discussione principale: conta 2
Thread di lavoro: conta 9
Discussione principale: conta 3
Thread di lavoro: conta 12
Discussione principale: conta 4
Thread di lavoro: conta 15
Discussione principale: conta 5
Thread di lavoro: terminato
Discussione principale: conclusa
Spiegazione: questo output mostra come i due thread funzionano contemporaneamente.Poiché il thread principale e quello in background lavorano in parallelo, il thread principale stampa numeri da 1 a 5. Il thread di lavoro stampa multipli da 3 a 15.
Dai un'occhiata ai corsi di sviluppo software su upGrad per migliorare le tue competenze.
Leggi i nostri articoli popolari relativi allo sviluppo software
Perché imparare a programmare? Come imparare a programmare? | Come installare una versione specifica del pacchetto NPM? | Tipi di ereditarietà in C++ Cosa dovresti sapere? |
Sincronizzazione dei thread
La sincronizzazione dei thread implica il coordinamento collettivo di più thread in un programma. Assicura che il programma venga eseguito in un ordine specifico che dà accesso alle risorse condivise.
In C#, viene eseguito utilizzando primitive di sincronizzazione come la parola chiave lock, gli oggetti di sincronizzazione e la classe Interlocked.
Di seguito viene fornito un esempio di sincronizzazione dei thread C# :
Utilizzando il sistema;
Utilizzo di System.Threading;
classe TablePrinter
{
vuoto pubblico PrintTable()
{
bloccare (questo)
{
per (int i = 3; i <= 8; i++)
{
Thread.Sleep(200);
Console.WriteLine(i*5);
}
}
}
}
programma di classe
{
public static void Main(string[] args)
{
TablePrinter tp = new TablePrinter();
Thread t1 = new Thread(new ThreadStart(tp.PrintTable));
Thread t2 = new Thread(new ThreadStart(tp.PrintTable));
t1.Inizio();
t2.Inizio();
}
}
Produzione:
15
20
25
30
35
40
45
50
55
60
Esplora i nostri corsi gratuiti di sviluppo software
Fondamenti di Cloud Computing | Nozioni di base su JavaScript da zero | Strutture dati e algoritmi |
Tecnologia blockchain | Reagire per principianti | Nozioni di base su Java di base |
Giava | Node.js per principianti | JavaScript avanzato |
Deadlock
I deadlock nel multithreading si verificano quando almeno due o più thread dipendono da un insieme di risorse. Quando un thread si sovrappone al percorso verso l'aiuto mentre l'altro cerca di fare lo stesso, diventa un deadlock.
Ad esempio, se il thread A ha un blocco sulla risorsa 1 ed è in attesa di accedere alla risorsa 2 mentre il thread B attende la risorsa 1, può verificarsi un deadlock.
Un esempio è dato seguito:
utilizzando il sistema;
usando System.Threading;
namespace deadlockincsharp
{
classe pubblica Esempio
{
oggetto statico di sola lettura firstLock = new object();
oggetto di sola lettura statico secondLock = new object();
vuoto statico ThreadJob()
{
Console.WriteLine(“\t\t\t\tBlocco primoBlocco”);
blocco (primo blocco)
{
Console.WriteLine(“\t\t\t\tBloccato firstLock”);
Thread.Sleep(1500);
Console.WriteLine(“\t\t\t\tBlocco secondoBlocco”);
blocco (secondo blocco)
{
Console.WriteLine(“\t\t\t\tSeconda serratura bloccata”);
}
Console.WriteLine(“\t\t\t\tSecondo blocco rilasciato”);
}
Console.WriteLine(“\t\t\t\tRilasciato firstLock”);
}
vuoto statico Main()
{
nuovo Thread(nuovo ThreadStart(ThreadJob)).Start();
Thread.Sleep(1000);
Console.WriteLine(“Bloccaggio secondLock”);
blocco (secondo blocco)
{
Console.WriteLine("Bloccato secondLock");
Console.WriteLine("Blocco primoBlocco");
blocco (primo blocco)
{
Console.WriteLine("Locked firstLock");
}
Console.WriteLine(“Rilasciato firstLock”);
}
Console.WriteLine(“Rilasciato secondo Blocco”);
Console.Leggi();
}
}
}
Produzione:
Bloccaggio secondoBlocco
Bloccato secondoBlocco
Bloccare primaBloccare
Bloccato primaBlocco
Rilasciato firstLock
Rilasciato secondoLock
Competenze di sviluppo software richieste
Corsi JavaScript | Corsi Java di base | Corsi di strutture dati |
Corsi Node.js | Corsi SQL | Corsi di sviluppo full stack |
Corsi NFT | Corsi DevOps | Corsi sui Big Data |
Corsi React.js | Corsi di sicurezza informatica | Corsi di cloud computing |
Corsi di progettazione di database | Corsi Python | Corsi di criptovaluta |
Pool di discussioni
I pool di thread consentono di gestire più thread di esecuzione in un ambiente multithread in C#. Questi assicurano che tutti i thread abbiano accesso a risorse controllate senza dare origine a deadlock.
Un gestore del pool di thread si occupa del pool di thread, dove è responsabile della creazione, distruzione e pianificazione dei thread.
Ecco un esempio di pool di thread che utilizza TPL (Task Parallel Library):
utilizzando il sistema;
utilizzando System.Threading.Tasks;
programma di classe
{
vuoto statico Main()
{
Attività<stringa> attività = Task.Factory.StartNew<stringa>
(() => DownloadString(“http://www.example.com/”));
stringa risultato = task.Result;
Console.WriteLine(risultato);
Console.Leggi();
}
stringa statica DownloadString(stringa uri)
{
using (var wc = new System.Net.WebClient())
return wc.DownloadString(uri);
}
Produzione:
L'output dipende dai contenuti disponibili sulla pagina web. Questo programma garantirà il download dei contenuti dalla pagina Web dall'URL specificato. Quindi li stamperà.
Programmazione asincrona con Task Parallel Library (TPL)
La Task Parallel Library (TPL) è un potente strumento per gestire API e tipi pubblici. Gestisce System.Threading e System.Threading.Tasks .
.NET Framework 4 offre API a livello di linguaggio e framework per gli sviluppatori che desiderano scrivere codice parallelo. Con l'aiuto di TPL, la programmazione asincrona consente l'esecuzione dei programmi senza bloccare il thread principale.
Ecco un esempio di programmazione asincrona con TPL:
Attività<stringa> attività = Task.Factory.StartNew<stringa>(() => {
restituire "risultato";
});
stringa risultato = task.Result;
attività asincrona MyMethod() {
stringa risultato = attesa attività;
}
Dai un'occhiata ai nostricorsi di tecnologia gratuiti per avere un vantaggio sulla concorrenza.
Best practice per il multithreading in C#
Il multithreading può far risparmiare tempo in termini di prestazioni e multitasking. Per saperne di più su come funziona il multithreading, puoi optare per un Master of Science in Computer Science presso LJMU .
Ecco alcune best practice per aiutare gli utenti a risparmiare tempo e registrare la massima efficienza.
- Utilizza raccolte thread-safe: le raccolte simultanee di .NET Framework forniscono una versione thread-safe di ogni raccolta, che semplifica il funzionamento efficiente del multithreading.Queste raccolte includono elenchi, query e dizionari.
- Implementazione della sincronizzazione dei thread: gli utenti possono implementare rapidamente blocchi, monitor e semafori a causa della natura degli strumenti dei thread.
- Usa il pool di thread: il multithreading può essere più semplice ed efficiente per i sistemi, grazie alla stragrande maggioranza del pool di thread eseguito dagli utenti.Allo stesso tempo, gli utenti possono usarlo per creare thread automaticamente.
- Usa l'archiviazione locale del thread: durante la pratica del multithreading, assicurati l'accesso a una particolare risorsa ottimizzando l'archiviazione locale del thread e offrendo l'accesso a più thread.
- Evita di condividere stati mutabili: gli stati mutabili condivisi porteranno solo a bug e race condition, che possono essere complicati.Assicurarsi di evitare stati mutabili ad ogni costo.
- Usa il modello asincrono: i metodi asincroni ti aiutano a implementare più attività in parallelo senza avviarle di nuovo o lasciarle in coda.
- Evita deadlock: quando si eseguono programmi che utilizzano il multithreading, è possibile che si verifichino deadlock.Quando scrivi un programma, prova a eseguire un thread solo dopo l'altro, evitando i deadlock.
- Usa i token di annullamento: i token di annullamento consentono di terminare i thread senza problemi ed evitare deadlock.
Esplora i nostri famosi corsi di ingegneria del software
Master of Science in Computer Science presso LJMU e IIITB | Programma di certificazione della sicurezza informatica Caltech CTME |
Bootcamp di sviluppo completo dello stack | Programma PG in Blockchain |
Programma Executive PG in sviluppo Full Stack | |
Visualizza tutti i nostri corsi di seguito | |
Corsi di ingegneria del software |
Conclusione
Il multithreading in C# rimane un concetto essenziale con il suo modello ad alta efficienza al lavoro. Fornisce un modo flessibile per i programmatori di dividere il carico di lavoro di un programma in più attività eseguite contemporaneamente e indipendentemente.
Sebbene il multithreading possa essere estremamente vantaggioso, può portare a potenziali ostacoli se non implementato con attenzione.
Con un budget globale per il software intraprendente che supera gli 856 miliardi di dollari tra il 2009 e il 2023, lo sviluppo del software promette una brillante carriera per gli sviluppatori.
Richiedi subito il Bootcamp di sviluppo software Full Stack da upGrad ! Un corso di sviluppo full stack può essere il trampolino di lancio per gli sviluppatori che vogliono liberare il loro potenziale nell'informatica.
1. Cos'è la programmazione multithread?
La programmazione multithread è un processo che prevede l'esecuzione di programmi che utilizzano più thread contemporaneamente. Consente agli utenti del front-end di utilizzare più copie del programma in esecuzione sul computer senza interruzioni.
2. Qual è la differenza principale tra thread e processo?
Un processo in genere coinvolge un programma nello stato di esecuzione, mentre un thread è costituito da un processo all'interno di un sottoprocesso.
3. Qual è la differenza tra un thread e un'attività in C#?
Un thread in C# si occupa della creazione e della gestione di un pool di thread destinato alla programmazione. D'altra parte, un'attività rappresenta una funzione asincrona che opera in background.