Pensavo che fossero fondamentalmente la stessa cosa: scrivere programmi che dividessero le attività tra processori (su macchine con più di 2 processori). Quindi sto leggendo questo , che dice:
I metodi asincroni sono intesi come operazioni non bloccanti. Un'espressione waitit in un metodo asincrono non blocca il thread corrente mentre il task atteso è in esecuzione. Invece, l'espressione registra il resto del metodo come continuazione e restituisce il controllo al chiamante del metodo asincrono.
Le parole chiave asincrone e attendono non causano la creazione di thread aggiuntivi. I metodi asincroni non richiedono il multithreading perché un metodo asincrono non viene eseguito sul proprio thread. Il metodo viene eseguito nel contesto di sincronizzazione corrente e utilizza l'ora sul thread solo quando il metodo è attivo. È possibile utilizzare Task.Run per spostare il lavoro associato alla CPU in un thread in background, ma un thread in background non aiuta con un processo che sta solo aspettando che i risultati diventino disponibili.
e mi chiedo se qualcuno può tradurlo in inglese per me. Sembra fare una distinzione tra asincronismo (è una parola?) E threading e implica che si può avere un programma che ha compiti asincroni ma non multithreading.
Ora capisco l'idea di compiti asincroni come l'esempio a pag. 467 di C # In Depth, terza edizione di Jon Skeet
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
La async
parola chiave significa " Questa funzione, ogni volta che viene chiamata, non verrà chiamata in un contesto in cui è richiesto il suo completamento affinché tutto dopo la sua chiamata sia chiamato".
In altre parole, scriverlo nel mezzo di un compito
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, poiché DisplayWebsiteLength()
non ha nulla a che fare con x
o y
, verrà DisplayWebsiteLength()
eseguito "in background", come
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Ovviamente questo è un esempio stupido, ma ho ragione o sono totalmente confuso o cosa?
(Inoltre, sono confuso sul perché sender
e e
non sono mai utilizzati nel corpo della funzione sopra.)
sender
e e
stanno suggerendo che questo è in realtà un gestore di eventi - praticamente l'unico posto dove async void
è desiderabile. Molto probabilmente, questo viene chiamato con un clic sul pulsante o qualcosa del genere - il risultato è che questa azione avviene completamente in modo asincrono rispetto al resto dell'applicazione. Ma è ancora tutto su un thread: il thread dell'interfaccia utente (con un piccolo intervallo di tempo su un thread IOCP che pubblica il callback nel thread dell'interfaccia utente).
DisplayWebsiteLength
codice: non si deve usare HttpClient
in using
un'istruzione - Sotto un carico pesante, il codice può esaurire il numero di socket disponibili causando errori SocketException. Maggiori informazioni sull'istanza impropria .