Ho visto alcune informazioni contrastanti sull'argomento e vorrei ottenere una certa chiarezza qui.Come implementare correttamente l'asincronia in web api 2
In origine, si dovrà azioni Api Web come:
Model Action();
HttpResponseMessage Action();
Poi, con l'aggiunta di miglioramenti TPL per Api Web, si potrebbe avere
Task<Model> Action();
Task<HttpResponseMessage> Action();
E presumibilmente, ASP.NET sarebbe abbastanza intelligente per gestire quelle di attesa per il compito di finire, e rilasciando il filo che raccolse la richiesta nel frattempo.
Bellissima! Tutto era semplice al mondo. Ma ora, con Web API 2, c'è l'aggiunta di IHttpActionResult
, un terzo caso, che fornisce il metodo Task<HttpResponseMessage> ExecuteAsync()
.
Prima di tutto, se si controlla implementazioni di IHttpActionResult
, si vede che ogni ExecuteAsync
in realtà restituisce solo Task.FromResult
(non ASYNC a tutti, e non sembra come sarebbe dare alcun guadagno di prestazioni sopra sincrono ritorno HttpResponseMessage
). Secondo, vedo le persone che consigliano di usare Task<IHttpActionResult>
, che sembra completamente ridondante. Vedo persino una manciata di persone che suggeriscono di unire questi approcci e di restituire Task.Factory.StartNew(..)
alla tua azione, il che sembra un po 'assurdo.
Quindi qual è il modo corretto di utilizzare IHttpActionResult
in modo asincrono? Implementa semplicemente la tua e esegui operazioni asincrone? O restituisci Task<IHttpActionResult>
, esegui il tuo metodo async
e attendi su operazioni legate all'IO prima di chiamare su return Ok()
(o equivalente)?
Per essere chiari, ovviamente comprendo che passare semplicemente da IHttpActionResult Action();
a Task<IHttpActionResult> Action();
senza modificare il metodo non aiuterà in alcun modo. È l'intento dello ExecuteAsync
che è un puzzle.
† https://stackoverflow.com/a/21609402/661422
usando 'Task.FromResult' è un dettaglio di implementazione - che è , l'implementatore ha preso la decisione di non usare l'asincronicità, ma può decidere di usarlo in futuro, se è giustificato. Considerando che non esiste un buon modo per implementare un'API sincrona in modo asincrono. –