1

Читал статью Understanding the Whys, Whats, and Whens of ValueTask

В которой указываются некие ограничение использования ValueTask. У меня не получилось воспроизвести не одно ограничение.

  1. Нельзя ожидать один ValueTask несколько раз вот пример как я делаю
bool isasync = true;
ValueTask<int> vl = asd();
System.Console.WriteLine(await vl);
System.Console.WriteLine(await vl);
ValueTask<int> asd()
{
 var task = Task.Run(async () =>
 {
 if(isasync)
 {
 isasync = false;
 System.Console.WriteLine("зашли");
 await Task.Delay(1000);
 return 123;
 }
 return 321;
 });
 return new ValueTask<int>(task);
}

Вывод

зашли
123
123

Т-е получаю корректный результат всегда как при использовании Task

  1. Нельзя ожидать конкурентно
 bool isasync = true;
 
 ValueTask<int> vl = asd();
 Task.Run(async () => System.Console.WriteLine(await vl));
 Task.Run(async () => System.Console.WriteLine(await vl));
 
 Console.ReadLine();
 
 ValueTask<int> asd()
 {
 var task = Task.Run(async () =>
 {
 if(isasync)
 {
 isasync = false;
 System.Console.WriteLine("зашли");
 await Task.Delay(1000);
 return 123;
 }
 
 return 321;
 });
 
 return new ValueTask<int>(task);
 }

Вывод

зашли
123
123

То-есть мы получаем такое же поведение как при использовании Task. Мой вопрос как добится не ожиданного поведения при использовании ValueTask? В статье говорится что может что то сломаться но я не могу понять что

задан 17 апр. 2022 в 10:28
1
  • Но ведь тут вы в ValueTask просто везде заворачиваете обычный Task, если я всё правильно понял. То есть весь смысл его теряется, это обычный Task по сути, просто положенный внутрь ValueTask. Commented 31 янв. 2024 в 6:30

1 ответ 1

1

Ограничения работают в случаях, когда в конструктор ValueTask прокинута реализация IValueTaskSource(например использующая внутри себя ManualResetValueTaskSourceCore). В статье, ссылку на которую вы указали, написано про IValueTaskSource, его роль и его реализации. Соответственно, чтобы воспроизвести, интересующие вас случаи, нужно прокинуть в ValueTask правильную реализацию IValueTaskSource.

ответ дан 30 янв. 2024 в 23:38

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.