Cependant, avec ASP.NET Web Api, si votre demande arrive sur un seul thread et que vous attendez une fonction, appelez
ConfigureAwait(false)
qui pourrait vous placer sur un autre thread lorsque vous renvoyez le résultat final de votre fonction ApiController. .En fait, il suffit de faire une
await
. Une fois que votre méthodeasync
enawait
, la méthode est bloquée mais le thread retourne au pool de threads. Lorsque la méthode est prête à continuer, tout thread est arraché du pool de threads et utilisé pour reprendre la méthode.
La source
Je viens de tester cela dans un programme de console:
async Task foo() { int y = 0; while (y<5) y++; } async Task testAsync() { int i = 0; while (i < 100) { Console.WriteLine("Async 1 before: " + i++); } await foo(); while (i < 105) { i++; Console.WriteLine("Async 1 after: " + i); } }
L’appel à await foo()
n’entraîne pas le testAsync
du thread sur testAsync
était en cours d’exécution dans le pool de threads, il testAsync
simplement ligne par ligne sur le même thread, du début à la fin. Qu’est-ce qui me manque ici?
Qu’est-ce qui me manque ici?
Il vous manque des avertissements du compilateur
Avertissement CS1998 Cette méthode asynchrone manque d’opérateurs “en attente” et s’exécutera de manière synchrone. Envisagez d’utiliser l’opérateur ‘wait’ pour attendre les appels d’API non bloquants ou ‘wait Task.Run (…)’ pour effectuer un travail lié à la CPU sur un thread en arrière-plan.
La méthode foo
n’est pas vraiment asynchrone car elle ne await
aucun appel en await
.
Essayez d’append await Task.Delay
à cet await Task.Delay
.