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à.
* 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'. –
Come hai tagliato la risposta in modo elegante? :) –
@YairNevet quale? –