ValueTask<TResult> Структура

Определение

Предоставляет тип значения, который упаковывает Task<TResult> и TResult, только один из которых используется.

generic <typename TResult>
public value class ValueTask : IEquatable<System::Threading::Tasks::ValueTask<TResult>>
public readonly struct ValueTask<TResult> : IEquatable<System.Threading.Tasks.ValueTask<TResult>>
type ValueTask<'Result> = struct
Public Structure ValueTask(Of TResult)
Implements IEquatable(Of ValueTask(Of TResult))

Параметры типа

TResult

Результат.

Наследование
ValueTask<TResult>
Реализации
IEquatable<ValueTask<TResult>>

Комментарии

ValueTask<TResult> Экземпляр может ожидаться или преобразован в Task<TResult> использованиеAsTask. Экземпляр ValueTask<TResult> может ожидаться только один раз, и потребители могут не читать Result до завершения экземпляра. Если эти ограничения неприемлемы, преобразуйте ValueTask<TResult> его в Task<TResult> вызов AsTask.

Следующие операции никогда не должны выполняться на экземпляре ValueTask<TResult> :

  • Ожидание экземпляра несколько раз.
  • Вызов AsTask несколько раз.
  • Использование .Result или .GetAwaiter().GetResult() когда операция еще не завершена или использует их несколько раз.
  • Использование нескольких из этих методов для использования экземпляра.

Если вы делаете любое из указанных выше действий, результаты не определены.

Метод может возвращать экземпляр этого типа значения, если скорее всего, результат его операции будет доступен синхронно, и когда ожидается, что стоимость выделения нового Task<TResult> для каждого вызова будет запрещена.

Существуют компромиссы для использования ValueTask<TResult> вместо Task<TResult>. Например, в то время как ValueTask<TResult> может помочь избежать выделения в случае, когда успешный результат доступен синхронно, он также содержит несколько полей, в то время Task<TResult> как в качестве ссылочного типа является одним полем. Это означает, что возврат ValueTask<TResult> из метода приводит к копированию дополнительных данных. Это также означает, что если метод, возвращающий объект ValueTask<TResult> , ожидается в асинхронном методе, то для этого асинхронного метода будет больше, так как он должен хранить структуру, содержащую несколько полей, а не одну ссылку.

Для использования, отличного от использования результата асинхронной операции с помощью await, может привести к более свертной модели программирования, ValueTask<TResult> требующей большего выделения. Например, рассмотрим метод, который может возвращать либо кэшированную задачу в качестве общего результата, либо Task<TResult> .ValueTask<TResult> Если потребитель результата хочет использовать его в качестве Task<TResult> метода, аналогичного WhenAll или WhenAny, ValueTask<TResult> сначала необходимо преобразовать в Task<TResult> использование AsTask, что привело бы к выделению, которое было бы избежать, если кэшированный Task<TResult> был использован в первую очередь.

Таким образом, выбор по умолчанию для любого асинхронного метода должен быть возвращен Task или Task<TResult>. Только если анализ производительности докажет, что он стоит ValueTask<TResult> использовать вместо .Task<TResult> Для большинства сценариев не рекомендуется использовать не универсальную версию ValueTask . Свойство CompletedTask должно использоваться для передачи успешно завершенного одноэлемента в случае, когда метод, возвращающий Task завершение синхронно и успешно.

Note

Использование типа ValueTask<TResult> поддерживается начиная с C# 7.0 и не поддерживается ни одной версией Visual Basic.

Note

Экземпляр, созданный с помощью конструктора без параметров или default(ValueTask<TResult>) синтаксисом (инициализируемой нулевой структурой), представляет синхронную, успешно завершенную операцию с результатом default(TResult).

Конструкторы

Имя Описание
ValueTask<TResult>(IValueTaskSource<TResult>, Int16)

Инициализирует новый экземпляр ValueTask<TResult> класса с IValueTaskSource<TResult> объектом, который представляет операцию.

ValueTask<TResult>(Task<TResult>)

Инициализирует новый экземпляр класса с помощью предоставленной ValueTask<TResult> задачи, представляющей операцию.

ValueTask<TResult>(TResult)

Инициализирует новый экземпляр ValueTask<TResult> класса, используя предоставленный результат успешной операции.

Свойства

Имя Описание
IsCanceled

Возвращает значение, указывающее, представляет ли этот объект отмененную операцию.

IsCompleted

Возвращает значение, указывающее, представляет ли этот объект завершенную операцию.

IsCompletedSuccessfully

Возвращает значение, указывающее, представляет ли этот объект успешно завершенную операцию.

IsFaulted

Возвращает значение, указывающее, представляет ли этот объект неудачную операцию.

Result

Возвращает результат.

Методы

Имя Описание
AsTask()

Извлекает Task<TResult> объект, представляющий этот ValueTask<TResult>объект.

ConfigureAwait(Boolean)

Настраивает средство ожидания для этого значения.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

Equals(ValueTask<TResult>)

Определяет, равен ли указанный ValueTask<TResult> объект текущему ValueTask<TResult> объекту.

GetAwaiter()

Создает средство ожидания для этого значения.

GetHashCode()

Возвращает хэш-код для этого экземпляра.

Preserve()

Возвращает объект ValueTask<TResult> , который может использоваться в любой момент в будущем.

ToString()

Возвращает строку, представляющую текущий объект.

Операторы

Имя Описание
Equality(ValueTask<TResult>, ValueTask<TResult>)

Сравнивает два значения для равенства.

Inequality(ValueTask<TResult>, ValueTask<TResult>)

Определяет, являются ли два ValueTask<TResult> значения неравными.

Применяется к