ValueTask .net5

Читал статью 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? В статье говорится что может что то сломаться но я не могу понять что


Ответы (1 шт):

Автор решения: farco8800

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

→ Ссылка