J'ai une API .net core qui possède un contrôleur qui construit un objet agrégé à retourner. L'objet qu'il crée est composé de données provenant de 3 appels de méthode à une classe de service. Ces méthodes sont toutes indépendantes les unes des autres et peuvent être exécutées indépendamment les unes des autres. Actuellement, j'utilise des tâches pour améliorer les performances de ce contrôleur. La version actuelle ressemble à quelque chose comme ceci...
[HttpGet]
public IActionResult myControllerAction()
{
var data1 = new sometype1();
var data2 = new sometype2();
var data3 = new List<sometype3>();
var t1 = new Task(() => { data1 = service.getdata1(); });
t1.Start();
var t2 = new Task(() => { data2 = service.getdata2(); });
t2.Start();
var t3 = new Task(() => { data3 = service.getdata2(); });
t3.Start();
Task.WaitAll(t1, t2, t3);
var data = new returnObject
{
d1 = data1,
d2 = data2,
d2 = data3
};
return Ok(data);
}
Cela fonctionne bien, mais je me demande si l'utilisation de tâches est la meilleure solution ici ? L'utilisation d'async/await serait-elle une meilleure idée et un moyen plus accepté ?
Par exemple, le contrôleur doit-il être marqué comme asynchrone et un await doit-il être placé sur chaque appel aux méthodes du service ?
1 votes
Fait
service
ne propose pas d'alternatives asynchrones pour legetdata
méthodes ? Par ailleurs, il faut généralement préférerTask.Run()
plutôt que de créer des tâches et de les lancer manuellement.2 votes
Async/await n'aide pas le parallélisme dans ce sens. En fait, il sérialise vos 3 demandes de service. En revanche, il peut vous aider lorsque vous faites
Task.WaitAll
puisque vous parquez un fil avec cette phrase.1 votes
Il n'y a aucune raison de créer des tâches à froid puis d'appeler.
Start
sur eux. Ce ne sont pas des fils. Utilisez simplementTask.Run
. Ensuite, utilisezawait Task.WhenAll