Il mio articolo MSDN sull'argomento potrebbe essere utile ; Ho preso molto spazio in quell'articolo che descrive quando dovresti usare async
su ASP.NET, non solo su come usare async
su ASP.NET.
Ho dei dubbi sull'utilizzo di azioni asincrone in ASP.NET MVC. Quando migliora le prestazioni delle mie app e quando no.
Per prima cosa, capisci che async
/ await
riguarda la liberazione dei thread . Sulle applicazioni GUI, si tratta principalmente di liberare il thread della GUI in modo che l'esperienza dell'utente sia migliore. Sulle applicazioni server (incluso ASP.NET MVC), si tratta principalmente di liberare il thread di richiesta in modo che il server possa scalare.
In particolare, non:
- Rendi più veloci le tue richieste individuali. In effetti, completeranno (solo un pochino) un po 'più lentamente.
- Tornare al chiamante / browser quando si preme un
await
. await
"cede" solo al pool di thread ASP.NET, non al browser.
La prima domanda è: è utile utilizzare l'azione asincrona ovunque in ASP.NET MVC?
Direi che è buono usarlo ovunque tu stia facendo I / O. Tuttavia, potrebbe non essere necessariamente utile (vedi sotto).
Tuttavia, è male usarlo per metodi associati alla CPU. A volte gli sviluppatori pensano di poter ottenere i vantaggi async
semplicemente chiamando i Task.Run
loro controller, e questa è un'idea orribile. Perché quel codice finisce per liberare il thread di richiesta prendendo un altro thread, quindi non c'è alcun vantaggio (e in effetti, stanno prendendo la penalità di switch di thread aggiuntivi)!
Devo usare parole chiave asincrone / attendi quando voglio interrogare il database (tramite EF / NHibernate / altro ORM)?
È possibile utilizzare qualsiasi metodo attendibile disponibile. In questo momento la maggior parte dei principali giocatori supporta async
, ma ce ne sono alcuni che non lo supportano . Se il tuo ORM non supporta async
, quindi non provare ad avvolgerlo Task.Run
o cose del genere (vedi sopra).
Si noti che ho detto "si può usare". Se stai parlando di ASP.NET MVC con un singolo back-end di database, allora (quasi sicuramente) non otterrai alcun vantaggio di scalabilità async
. Questo perché IIS è in grado di gestire richieste più simultanee rispetto a una singola istanza di SQL Server (o altri RDBMS classici). Tuttavia, se il back-end è più moderno - un cluster di server SQL, SQL Azure, NoSQL, ecc - e il vostro backend possono scalare, e il collo di bottiglia è la scalabilità di IIS, quindi è possibile ottenere un beneficio scalabilità da async
.
Terza domanda: quante volte posso usare parole chiave wait per interrogare il database in modo asincrono in UN metodo a singola azione?
Quanti ne vuoi. Tuttavia, si noti che molti ORM hanno una regola per operazione per connessione. In particolare, EF consente una sola operazione per DbContext; questo è vero se l'operazione è sincrona o asincrona.
Inoltre, tieni presente di nuovo la scalabilità del tuo backend. Se stai colpendo una singola istanza di SQL Server e IIS è già in grado di mantenere SQL Server a piena capacità, raddoppiare o triplicare la pressione su SQL Server non ti aiuterà affatto.