Поделиться через


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> или , необходимо сначала преобразовать Task<TResult> в с помощью AsTask, что приводит к выделению, которое можно было бы избежать, если бы в первую очередь использовался кэшированный Task<TResult> объект.ValueTask<TResult>WhenAnyWhenAll

Таким образом, любой асинхронный метод по умолчанию должен возвращать 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>.

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