Есть ли разница между lambdas () => DoSomethingAsync()
и async () => await DoSomethingAsync()
, если оба они напечатаны как Func<Task>
? Какой из них мы предпочитаем и когда?
Вот простое консольное приложение
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"));
}
}
}
Вывод:
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
Итак, в RunTheDemo
оба вызова await Runner(someLambda);
оказываются похожими на те же самые временные характеристики - обе имеют правильную двухсекундную задержку.
Обе линии работают, точно так же они эквивалентны? В чем разница между конструкциями () => DoSomethingAsync()
и async () => await DoSomethingAsync()
? Какой из них мы предпочитаем и когда?
Это не тот же вопрос, как "следует использовать await
в общем случае", так как здесь мы имеем дело с работающим асинхронным кодом, с lambdas, напечатанным как Func<Task>
, которые правильно ожидаются внутри метода потребления. Вопрос касается того, как объявляются эти лямбды, и каковы последствия этой декларации.