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
Результат.
- Наследование
- Реализации
-
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>. |