2015-10-11 22 views
6

Dopo due domande e molta confusione - mi chiedo se finalmente ho capito bene. Questa è la mia comprensione:async/await - La comprensione è corretta?

async/await serve un solo scopo - per consentire il codice da eseguire dopo un già compito asincrona è finito. ad es.

async Task CallerMethod() 
{ 
    await AsyncMethod(); 
    AnotherMethod(); 
} 

permette AnotherMethod da eseguire dopo la asincrono AsyncMethod è finito anziché immediatamente dopo AsyncMethod è avviato.

async/attendi MAI rende nulla, in modo asincrono,. Non inizia un thread separato (a meno che il metodo atteso lo faccia comunque, ovviamente), ecc.

La mia comprensione (finalmente) è corretta?

+2

sì, suona bene, ma tieni presente che puoi finire su un altro thread anche se "AsyncMethod' non genera thread - la tua callback può essere generata in qualsiasi thread-thread – Carsten

+0

@Carsten Grazie. Supponendo che per 'callback' tu intendi' AnotherMethod(); '- questo avrebbe un'implicazione molto importante - che non potrei aggiornare l'interfaccia utente da esso - è davvero vero? – ispiro

+1

No, è possibile aggiornare in modo sicuro l'interfaccia utente da esso. La ragione di ciò è che ogni Thread ha un 'SynchronizationContext' che viene usato dal codice generato da async/attende di inviare il callback che termina il metodo asincrono. Nel caso di WPF (ad esempio), quella classe è un 'DispatcherSynchronizationContext' che si assicura di richiamare il metodo sul thread Dispatcher se necessario. C'è una classe simile per WinForms. –

risposta

15

Sebbene la risposta di Stephen sia corretta, voglio assicurarmi di avere qualche punto in più chiaro.

asincrone/attendono non fa mai nulla asincrono

Rende CallerMethod un metodo asincrono. CallerMethod restituisce un Task che può essere a sua volta attendibile e CallerMethod restituisce quell'attività prima che il lavoro di CallerMethod sia esso stesso completo, quindi è un metodo asincrono.

Non rende AsyncMethod asincrono; era già asincrono.

E non si avvia un thread separato

destro. Questa è una fonte frequente di confusione. I thread sono un'unità di concorrenza, che è solo un tipo di asincronia. Di solito un'analogia aiuta. Puoi mettere il pane nel tostapane, aspettare che tocchi e quindi fare le uova. Puoi mettere il pane nel tostapane, cuocere le uova mentre il toast sta tostando e poi affrontare il brindisi dopo che le uova sono state fatte. Oppure puoi assumere due cuochi, uno per cucinare le uova e l'altro per fare il pane tostato. Il primo è l'elaborazione sincrona. Il secondo e il terzo sono asincroni, ma solo il terzo è simultaneo. Si noti che la terza soluzione è la più costosa; i fili sono lavoratori e i lavoratori non sono economici.

Ciò che rende asincrono un metodo asincrono non è che sia simultaneo, anche se potrebbe essere. Ciò che lo rende asincrono è che ti dà un meccanismo che ti permette di fare qualcosa di diverso mentre stai aspettando il completamento del suo lavoro . await è solo un modo piacevole per scrivere "ecco il codice che voglio che venga eseguito dopo che l'attività è stata completata con successo".

+0

Grazie. Vorrei notare, tuttavia, che quando alcuni dicono "thread" - loro (noi) potrebbero non riferirsi a thread reali (come nella tua terza analogia). Sono piuttosto, riferendosi a qualsiasi momento in cui due operazioni sono simultanee, avvolgendo insieme la tua 2a e 3a analogia. Quindi, sia che si tratti di un thread vero o solo di un disco rigido, considererebbero questo "multithreading". Ad ogni modo - non discutendo di nulla qui, sono solo alcune (forse corrette) informazioni che possono aiutarti ad aiutare gli altri. Grazie ancora! – ispiro

+2

@ispiro: Questo di per sé allude a un malinteso comune; Stephen ha un grande articolo che smaschera l'idea che l'I/O hardware sia in qualche modo multithreaded, e non posso certamente fare di meglio che indirizzarvi ad esso. Fai una ricerca su "Stephen Cleary non c'è thread" e lo troverai. –

+1

È semantica, ma penso che * concurrent * non sia la parola migliore qui. Di solito chiamiamo simultaneamente la seconda e la terza opzione mentre vengono eseguite 2 operazioni contemporaneamente ma chiamiamo solo il terzo * parallel * in quanto richiede più chef (o thread) in esecuzione in parallelo. Da qui l'espressione "Concorrenza a thread singolo". – i3arnon

7

async/await MAI rende nulla asincrono. Non inizia un thread separato (a meno che il metodo atteso lo faccia comunque, ovviamente), ecc.

Sì.

In un altro modo, async/await consente di scrivere codice da una prospettiva asincrona. In altre parole, il codice può "attendere in modo asincrono" (await) le operazioni da completare e, a sua volta, definire la propria operazione asincrona (l'attività restituita da un metodo async, che rappresenta l'esecuzione di tale metodo).

Problemi correlati