Threads & Tasks

in C#, Informatica

Threads & Tasks in C#

I Threads sono un’astrazione a basso livello rispetto ai Tasks. Un Task può essere considerata come una porzione di codice che deve essere eseguita separatamente rispetto al flusso del programma, mentre un Task è un processo che viene eseguito come attività all’interno del sistema operativo. In questo post vengono analizzate le principali differenze tra Tasks e Threads.

Quando in c# viene creato un thread, il suo codice può sembrare molto simile a quello di un Task. In realtà esistono differenze piuttosto importanti:

  • i Threads sono creati come processi foreground, anche se possono essere eseguiti in background. Eseguire un processo in foreground significa che l’applicazione non può terminare fino a quando non sono stati terminati tutti i thread eseguiti in foreground. Il principale problema è quello di loop infiniti: un applicazione nella quale vengono eseguiti thread in un loop infinito non potrà mai terminare in maniera autonoma (a meno che non si verifichi al suo interno un’eccezione)
  • I Tasks sono eseguiti come processi in background. Questo significa che viene eseguito in maniera autonoma rispetto alla processo che lo ha eseguito
  • Ai Threads è possibile associare una priorità che può essere modificata durante il ciclo di vita del thread stesso. E’ possibile associare una maggiore priorità ad un thread, ad esempio, per garantirgli una maggiore porzione di esecuzione
  • Ai Tasks non è possibile associare una priorità
  • Un thread non può fornire un risultato ad un altro thread. I threads possono comunicare utilizzando variabili condivise, con l’implementazione di meccanismi di sincronizzazione
  • Non è possibile definire una “continuazione” all’esecuzione di un thread. Esiste la possibilità di mettere in attesa un thread aspettando il termine dell’esecuzione di un altro thread (es. utilizzando il il metodo join)
  • Non è possibile ottenere eccezioni di tipo aggregato (Aggregate Exceptions) in caso di esecuzione di threads differenti. Un’ eccezione eseguita all’interno di un thread deve essere rilanciata e intercettata dal codice all’interno del thread stesso
  • I Tasks prevedono un meccanismo di gestione che consente di gestire le eccezioni in forma aggregata (aggregate exceptions)
La classe Threads