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>>
public 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 завершенный синхронно и успешно.

Примечание

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

Примечание

Экземпляр, созданный с помощью конструктора без параметров или синтаксисом 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)

Настраивает объект типа awaiter для этого значения.

CreateAsyncMethodBuilder()

Создает построитель метода для использования с асинхронным методом.

Equals(Object)

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

Equals(ValueTask<TResult>)

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

GetAwaiter()

Создает объект типа awaiter для этого значения.

GetHashCode()

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

Preserve()

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

ToString()

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

Операторы

Equality(ValueTask<TResult>, ValueTask<TResult>)

Сравнивает два значения на предмет их равенства.

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

Определяет неравенство двух значений ValueTask<TResult>.

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