Classe operativa
La classe Task è un'astrazione asincrona di operazione fornita dopo .NET 4.0, con il percorso completo verso System.Threading.Tasks.Task.
La classe Task viene utilizzata per rappresentare operazioni asincrone senza valore di ritorno, e per operazioni asincrone con valori di ritorno, dovrebbe essere utilizzata la sottoclasse Task della classe Task<TResult>. I compiti creati dalla classe Task vengono aggiunti al pool di thread.
I <TResult>principali costruttori della classe Task/Task sono i seguenti:
Una volta creata, il compito può essere avviato usando il metodo Start():
Nello sviluppo effettivo, il metodo statico Run() della classe Task o il metodo membro StartNew() della classe fabbrica TaskFactory sono più spesso utilizzati per creare e avviare nuovi compiti.
Alcuni metodi comuni nella classe Task:
parola chiave async/await
C# 5.0 introdusse le parole chiave async e await, che offrivano un migliore supporto per la concorrenza a livello linguistico.
Async viene utilizzato per contrassegnare i metodi asincroni: La parola chiave asincrona è una parola chiave contestuale e verrà trattata come parola chiave solo quando si modifica un metodo e Lambda, e sarà trattata come identificatore in altre aree. La parola chiave async può segnare metodi statici, ma non i punti di ingresso (metodi Main()).
Il valore di ritorno del metodo etichettato con asincrono deve essere <TResult>uno di Task, Task o void. Await viene usato per aspettare il risultato del metodo asincrono:
La parola chiave await è anch'essa una parola chiave contestuale ed è considerata una parola chiave solo nel metodo con tag asincrono. La parola chiave wait può essere usata prima del metodo asincrono, e Task, e <TResult>Task, per attendere la fine dell'esecuzione asincrona. Una struttura semplice di metodo asincrono è la seguente:
Non è che il metodo sia contrassegnato con la parola chiave asincrona, è un metodo asincrono, e le istruzioni che appaiono direttamente all'interno del metodo asincrono sono anch'esse eseguite in modo sincrono,I contenuti eseguiti in modo asincrono devono essere eseguiti utilizzando la classe Task。 Infatti, un metodo asincrono che non contiene alcuna istruzione await verrà eseguito in modo sincrono, a quel punto il compilatore fornirà un avviso.
Esempio semplice, usare async/await per produrre contenuti contemporaneamente sullo schermo:
Output: (Mono 4.4.0 & ArchLinux x64)
Non è difficile vedere dal programma sopra che nel metodo asincrono con tag async key, il codice prima di usare await viene eseguito in modo sincrono, e dopo aver chiamato await, il codice rimanente viene eseguito asincronamente su un thread separato.
|