top of page

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


Околокомпьютерный блог Алика

  • alt.text.label.Facebook

© Околокомпьютерный блог Алика , 2022. Сайт создан на Wix.com

bottom of page