TGViewer
StepOne | Степан Минин StepOne | Степан Минин @steponeit · 3.27K subscribers
Post #224 1.95K
Task vs ValueTask

Что такое Task знают все C# разработчики - класс, олицетворяющий длительную операцию в асинхронном программировании.

А вот в 7 версии языка появилась структура ValueTask, и до сих пор не всем ясно её назначение.

Из интересного в ней два поля - первое для хранения задачи, второе для хранения результата (при наличии).

Поскольку Task это класс, то его экземпляр хранится в куче, а значит высвобождением памяти будет заниматься GC.

ValueTask это структура, а значит вероятнее всего окажется на стеке, и расходов на высвобождение памяти будет потрачено существенно меньше.

Соответственно, стоит использовать эту структуру, когда мы ожидаем, что задача будет выполняться синхронно большинство времени (например, закэшированный результат) или расходы на вызов и ожидание обычной задачи будут больше.

Однако, есть ряд ограничений, то есть, нельзя делать следующие вещи:

⭐️ Ожидать задачу конкурентно или несколько раз

⭐️ Вызывать метод AsTask несколько раз

⭐️ Использовать .Result или .GetAwaiter().GetResult(), если задача не завершена

⭐️ Использовать задачу в комбинаторах WhenAll() и WhenAny()
  • 👍 19
  • ❤ 3
  • 👏 3
More from @steponeit
  1. Sep 29, 2026Рассказал как автоматизировал сборку лексера компилятором для своего языка программировани…
  2. Sep 28, 2026Пошутил про джавистов в прямом эфире 😅 Шарпизм победил окончательно и бесповоротно!
  3. Sep 27, 2026Post #860
  4. Sep 25, 2026Рассказал как я добавил в HydraScript объекты и методы без классов и сделал протоколы. Стр…
  5. Sep 22, 2026Post #858
  6. Sep 21, 2026Post #857
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →