2013-06-29 7 views
8

Così mi è stato chiesto this question su async, e ho pensato che è solo una sintassi zucchero per:C# 5 asincrono come una sintassi dello zucchero (o non)?

Task<..>...ContinueWith...

E infine ispezionare la proprietà Result.

Ho anche chiesto una domanda su di esso here e mi hanno detto:

enter image description here

enter image description here

Ma oggi I was corrected by Jon Skeet

"E 'molto lontano da quello".

Quindi quali sono le differenze principali tra questi 2 approcci?

+3

* Concettualmente * l'uso di 'await' è simile a' ContinueWith', ma ci sono molti piccoli dettagli che "attendi" si prendono cura di te che dovresti fare da te con 'ContinueWith'. –

+0

Come hai tagliato la risposta in modo elegante? :) –

+0

@YairNevet quale? –

risposta

15

E è aggiungendo una continuazione - ma manualmente la costruzione di quella continuazione può essere molto dolorosa, a causa della necessità di portare in giro tutte le informazioni su dove siamo arrivati ​​e quale sia lo stato locale.

Come semplice esempio molto, vi consiglio di provare a venire con l'equivalente di questo metodo asincrono:

public static async Task<int> SumTwoOperationsAsync() 
{ 
    var firstTask = GetOperationOneAsync(); 
    var secondTask = GetOperationTwoAsync(); 
    return await firstTask + await secondTask; 
} 

// These are just examples - you don't need to translate them. 
private async Task<int> GetOperationOneAsync() 
{ 
    await Task.Delay(500); // Just to simulate an operation taking time 
    return 10; 
} 

private async Task<int> GetOperationTwoAsync() 
{ 
    await Task.Delay(100); // Just to simulate an operation taking time 
    return 5; 
} 

davvero cercare di venire con l'equivalente del primo metodo. Penso che troverete che ci vuole un bel po 'di codice - in particolare se in realtà si desidera tornare ad un thread appropriato ogni volta. (Immaginate che il codice in quel metodo asincrono abbia anche modificato un'interfaccia utente WPF, per esempio.) Oh, e assicuratevi che se una delle attività fallisce, anche l'attività restituita fallisce. (Il metodo asincrono "fallisce" effettivamente l'errore della seconda attività se anche il primo compito fallisce, ma questo è un problema relativamente minore IMO.)

Successivamente, scopri come avresti bisogno di cambiare il tuo codice se era necessario l'equivalente di try/finally nel metodo async. Di nuovo, renderà il metodo non asincrono più complicato. Tutto può essere fatto, ma è un dolore al collo.

Quindi sì, è "solo" zucchero sintattico. Quindi è foreach. Quindi è un ciclo for (o qualsiasi altro tipo di loop). Nel caso di async/await, è lo zucchero sintattico che può davvero fare molto per trasformare il tuo codice.

Ci sono sacco di video e post di blog in tutto asincrono, e mi aspetto che solo a guardare/leggere alcuni di loro darebbe abbastanza intuizione di capire che questo è ben lungi dall'essere un tweak minore: si radicalmente cambia la praticità di scrivere correttamente grandi quantità di codice asincrono.

Inoltre, essendo a base di modello, async/attendono non fa solo lavoro su Task/Task<T>. Puoi aspettare tutto ciò che aderisce al modello attendibile.In pratica, pochissimi sviluppatori dovranno implementare il modello da soli, ma consente metodi come Task.Yield che restituisce un YieldAwaitable anziché un'attività.

+0

-Grazie Jon. –

+0

Quindi no, non è "solo" zucchero sintattico! Vedi gestito IL. Sarai molto sorpreso della differenza tra l'attività con e senza utilizzare async/await. – hVostt

+2

@hVostt: ho decompilato * un sacco * di codice asincrono/atteso. Non sarò più sorpreso della differenza, ma continuo a pensare che sia "solo" zucchero sintattico. È uno zucchero sintattico molto utile e piuttosto complicato, e a volte i risultati sono un codice che non può essere rappresentato in * esattamente * in IL usando C# 4 - ma fondamentalmente non sta facendo nulla che in realtà non potrebbe essere fatto prima. Non è come i farmaci generici, che è stato un cambiamento fondamentale nel sistema dei tipi. Questo è solo il compilatore intelligente. Non sto cercando di sottovalutare quanto sia utile - I * love * async. Ma è ancora zucchero sintattico IMO. –

Problemi correlati