Y a-t-il une différence entre les lambdas () => DoSomethingAsync()
y async () => await DoSomethingAsync()
lorsque les deux sont tapés comme Func<Task>
? Lequel faut-il préférer et quand ?
Voici une application console simple
using System;
using System.Threading.Tasks;
namespace asyncDemo
{
class Program
{
static void Main(string[] args)
{
var demo = new AsyncDemo();
var task = demo.RunTheDemo();
task.Wait();
Console.ReadLine();
}
}
public class AsyncDemo
{
public async Task Runner(Func<Task> action)
{
Console.WriteLine(DateTime.Now.ToLongTimeString() + " Launching the action");
await action();
}
private async Task DoSomethingAsync(string suffix)
{
await Task.Delay(2000);
Console.WriteLine(DateTime.Now.ToLongTimeString() + " Done something, " + suffix);
}
public async Task RunTheDemo()
{
await Runner(() => DoSomethingAsync("no await"));
await Runner(async () => await DoSomethingAsync("with await"));
}
}
}
La sortie est :
09:31:08 Launching the action
09:31:10 Done something, no await
09:31:10 Launching the action
09:31:12 Done something, with await
Ainsi, en RunTheDemo
les deux appels à await Runner(someLambda);
semblent faire la même chose avec les mêmes caractéristiques de synchronisation - les deux ont un retard correct de deux secondes.
Les deux lignes fonctionnent, alors sont-elles exactement équivalentes ? Quelle est la différence entre les () => DoSomethingAsync()
y async () => await DoSomethingAsync()
des constructions ? Laquelle faut-il privilégier et quand ?
Il ne s'agit pas de la même question que "dois-je utiliser await
dans le cas général", car ici nous avons affaire à du code asynchrone qui fonctionne, avec des lambdas typés en tant que Func<Task>
qui sont correctement attendues dans la méthode de consommation. La question est de savoir comment ces lambdas sont déclarées et quels sont les effets de cette déclaration.