C# Async Lazy
- Алик Ким
- 17 февр. 2023 г.
- 1 мин. чтения
довольно активно пользуюсь классом Lazy<>, очень удобно
и тут немного забуксовал, потому что для инициализации значения Lazy понадобилось сделать асинхронный вызов
чуть потупил, чуть погуглил, и вот эта ссылка: https://endjin.com/blog/2023/01/dotnet-csharp-lazy-async-initialization навела на решение.
теперь то оно мне кажется очевидным :)
в общем, да, я - тугодум.
итак, асинхронным аналогом, например, Lazy<int> является Task<int> :)
оказывается, один и тот же таск можно await'ить много раз. и реально он выполнится только в первый раз :)
проверочный код - ниже. первая и вторая единицы выводятся на экран без временного промежутка, однровременно.
static async Task Main(string[] args)
{
var waitingTask = f();
Console.WriteLine(0);
Console.WriteLine(await waitingTask);
Console.WriteLine(await waitingTask);
Console.WriteLine("DONE");
Console.ReadKey();
//return Task.CompletedTask;
}
static async Task<int> f()
{
await Task.Delay(1000);
return 1;
}
Поправка:
нужно использовать все таки Lazy<Task<int>>. потому что в коде выше на строчке "var waitingTask = f();" таск уже выполняется.
Lazy<Task<int>> _myLazyAsyncValue = ...
...
int x = await _myLazyAsyncValue.Value;
...
int y = await _myLazyAsyncValue.Value;
Comentarios