Sto provando a eseguire il benchmark (utilizzando Apache bench) un paio di endpoint ASP.NET Web 2.0. Uno dei quali è sincrono e uno asincrono.ASP.NET Web API 2 Metodi di azione asincrona con Task.Run prestazioni
[Route("user/{userId}/feeds")]
[HttpGet]
public IEnumerable<NewsFeedItem> GetNewsFeedItemsForUser(string userId)
{
return _newsFeedService.GetNewsFeedItemsForUser(userId);
}
[Route("user/{userId}/feeds/async")]
[HttpGet]
public async Task<IEnumerable<NewsFeedItem>> GetNewsFeedItemsForUserAsync(string userId)
{
return await Task.Run(() => _newsFeedService.GetNewsFeedItemsForUser(userId));
}
Dopo aver visto Steve Sanderson's presentation ho emesso il seguente comando ab -n 100 -c 10 http://localhost....
per ciascun endpoint.
Sono rimasto sorpreso dal fatto che i parametri di riferimento per ciascun endpoint sembravano approssimativamente uguali.
Andando fuori quello che Steve ha spiegato che mi aspettavo che l'endpoint asincrono sarebbe più performante perché avrebbe liberato le discussioni pool di thread di nuovo al pool di thread immediatamente, rendendoli così disponibili per altre richieste e produttività migliorando. Ma i numeri sembrano esattamente gli stessi.
Cosa sto fraintendendo qui?
Ok, ho capito che Task.Run è una cattiva idea in ASP.NET perché usa una discussione dal pool di thread. Suppongo che ora le mie domande siano (1) Dovrei provare a consegnare questo lavoro a un altro thread? la mia chiamata a '' '_newsFeedService.GetNewsFeedItemsForUser (userId)' '' è una chiamata a un database, che suppongo sia di rete e I/O, non di CPU. (2) Se è una buona idea, come dovrebbe essere scritto quel codice? Tutti gli esempi che vedo non mostrano quel bit del codice. Qualsiasi esempio sarebbe davvero utile. –
@SimonLomax Basta cercare "C# entity framework async" - https://msdn.microsoft.com/en-us/data/jj819165.aspx se si utilizza il framework di entità o "database asincrono C#" -http: // www. tugberkugurlu.com/archive/asynchronous-database-calls-with-task-based-asynchronous-programming-model-tap-in-asp-net-mvc-4 se si utilizza ADO standard. –
In realtà sto usando mongo e il driver C# per mongo, non Entity Framework. A prescindere da ciò, da quello che dici, a meno che le chiamate che sto facendo dal mio metodo personalizzato '' '_newsFeedService.GetNewsFeedItemsForUser (userId);' '' sono asincrone quindi non ha senso cercare di rendere il mio metodo di azione del controller asincrono. –