In attesa immediata di una chiamata asincrona [duplicato]

5

Mentre lavoravo su un progetto ereditato, ho notato che gli sviluppatori originali hanno creato molte funzioni asincrone che mai sembrano per trarre vantaggio dall'essere, beh, asincrono . Ad esempio:

// The async method
private async Type myFuncAsync() { .. gets something from DB .. }

//  Example of how the method is consistently utilized
public async Type seaHorses() {
   var seaPony = await myFuncAsync();
   .. do stuff ..
}

Da quanto ho capito, questo è inutile perché se stai chiamando immediatamente await quando spari un metodo async , allora stai solo scrivendo codice sincrono. Non sarebbe diverso da scrivere:

// The sync method
private Type myFunc() { .. gets something from DB .. }

//  Example of how the method is consistently utilized
public Type seaHorses() {
   var seaPony = myFunc();
   .. do stuff ..
}

Considerando ciò che mi aspetto un uso efficiente di un metodo async come:

// The async method
private async Type myFuncAsync() { .. gets something from DB .. }

//  Example of how the method is consistently utilized
public async Type seaHorses() {
   var loveSeaHorses = myFuncAsync();
   .. do stuff ..
   await loveSeaHorses;
}

Questa supposizione è corretta? C'è qualche motivo a favore o contro l'aver definito metodi come async che hanno sempre chiamato% co_de immediatamente?

Nota: da qualche ricerca, ho una vaga comprensione che chiamare immediatamente await significa che il thread principale continua l'esecuzione. Nell'esempio sopra, significa che il lavoro verrà eseguito sul thread principale per ciò che viene dopo await finché non viene eseguito seaHorses() all'interno di myFuncAsync() . Il che mi porta a sottolineare il seguente scenario e a chiedere se si tratta di un utilizzo improprio della programmazione asincrona :

// The async method
private async Type myFuncAsync() { .. gets something from DB .. }

//  Example of how the method is consistently utilized
public async Type seaHorses() {
   var seaPony = await myFuncAsync();
   .. do stuff ..
}

// Main Thread
Program {
   .. do stuff ..
   var waterHorses = await seaHorses();
   .. do stuff..
}
    
posta 8protons 01.12.2017 - 22:46
fonte

1 risposta

11

Penso che tu abbia frainteso la chiamata await . Quello che async e await do è consentire al thread su cui stai eseguendo (non solo il thread principale) di continuare a lavorare. Il meccanismo che supporta questo è chiamato continuazione . Quindi, invece del blocco del thread (in attesa) per IO, può essere eseguito altri compiti. Una volta completata l'attività in await , il thread continuerà da quel punto.

Il valore di questo potrebbe non sembrare intuitivo, ma le macchine contemporanee possono supportare solo tanti thread del sistema operativo prima che il sovraccarico della gestione dei thread superi i vantaggi. Questo tipo di "threading leggero" consente un uso più efficiente dei thread a livello di sistema. Ad esempio, un server web potrebbe supportare molte richieste simultanee utilizzando una manciata di thread invece di usare centinaia che era tipico nel passato non troppo lontano.

    
risposta data 01.12.2017 - 23:00
fonte