ValueTask<TResult> ValueTask<TResult> ValueTask<TResult> ValueTask<TResult> Struct

Определение

Предоставляет тип значения, который заключает в оболочку Task<TResult> и TResult, из которых используется только один.Provides a value type that wraps a Task<TResult> and a TResult, only one of which is used.

generic <typename TResult>
public value class ValueTask : 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

Результат.The result.

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

Комментарии

Объект ValueTask<TResult> экземпляр может быть ожидается или преобразовать Task<TResult> с помощью AsTask.A ValueTask<TResult> instance may either be awaited or converted to a Task<TResult> using AsTask. Объект ValueTask<TResult> экземпляр может ожидать только один раз, и потребители не может вызывать GetAwaiter() до завершения экземпляра.A ValueTask<TResult> instance may only be awaited once, and consumers may not call GetAwaiter() until the instance has completed. Если эти ограничения неприемлемы, преобразуйте ValueTask<TResult> для Task<TResult> путем вызова AsTask.If these limitations are unacceptable, convert the ValueTask<TResult> to a Task<TResult> by calling AsTask.

Никогда не следует выполнять следующие операции на ValueTask<TResult> экземпляр:The following operations should never be performed on a ValueTask<TResult> instance:

  • Ожидается экземпляр несколько раз.Awaiting the instance multiple times.
  • Вызов AsTask несколько раз.Calling AsTask multiple times.
  • С помощью .Result или .GetAwaiter().GetResult() при операции еще не завершила или использовать их несколько раз.Using .Result or .GetAwaiter().GetResult() when the operation hasn't yet completed, or using them multiple times.
  • С помощью более чем в одной из этих методов для использования экземпляра.Using more than one of these techniques to consume the instance.

Если выполнять какие-либо из перечисленных выше, результаты будут неопределенными.If you do any of the above, the results are undefined.

Метод может возвращать экземпляр этого типа значения, где оно, вероятно, что результат его работы будут доступны синхронно, и когда он должно быть настолько часто, приводящее расходам на новый Task<TResult> для каждого вызова будут чрезмерно высокой.A method may return an instance of this value type when it's likely that the result of its operation will be available synchronously, and when it's expected to be invoked so frequently that the cost of allocating a new Task<TResult> for each call will be prohibitive.

Есть и недостатки использования ValueTask<TResult> вместо Task<TResult>.There are tradeoffs to using a ValueTask<TResult> instead of a Task<TResult>. Например, хотя ValueTask<TResult> поможет избежать распределения в случае успешного результата где доступны синхронно, он также содержит два поля, тогда как Task<TResult> как ссылку на тип состоит из одного поля.For example, while a ValueTask<TResult> can help avoid an allocation in the case where the successful result is available synchronously, it also contains two fields, whereas a Task<TResult> as a reference type is a single field. Это означает, что вызов метода возвращает два поля стоит данных вместо одного, это дополнительные данные для копирования.This means that a method call returns two fields worth of data instead of one, which is more data to copy. Это также означает, что если метод, возвращающий ValueTask<TResult> оказывается внутри асинхронного метода, конечный автомат для этого асинхронного метода будет больше, так как должен сохраняться структуры, содержащий два поля, а не одна ссылка.It also means, that if a method that returns a ValueTask<TResult> is awaited within an async method, the state machine for that async method will be larger, because it must store a struct containing two fields instead of a single reference.

Для использует отличные от использования результат асинхронной операции с помощью await, ValueTask<TResult> может привести к более сложные модели программирования, которая требует дополнительные выделения.For uses other than consuming the result of an asynchronous operation using await, ValueTask<TResult> can lead to a more convoluted programming model that requires more allocations. Например, рассмотрим метод, который может возвращать либо Task<TResult> с кэшированную задачу как общий результат или ValueTask<TResult>.For example, consider a method that could return either a Task<TResult> with a cached task as a common result or a ValueTask<TResult>. Если результата необходимо использовать в качестве Task<TResult> в методе, подобном WhenAll или WhenAny, ValueTask<TResult> необходимо сначала преобразовать в Task<TResult> с помощью AsTask, что приведет к распределения, которое бы было избежать при кэшированные Task<TResult> была использована в первую очередь.If the consumer of the result wants to use it as a Task<TResult> in a method like WhenAll or WhenAny, the ValueTask<TResult> must first be converted to a Task<TResult> using AsTask, leading to an allocation that would have been avoided if a cached Task<TResult> had been used in the first place.

Таким образом, выбор по умолчанию для любого асинхронного метода следует возвращать Task или Task<TResult>.As such, the default choice for any asynchronous method should be to return a Task or Task<TResult>. Следует только в том случае, если анализ производительности оказывается оправданной ValueTask<TResult> использоваться вместо Task<TResult>.Only if performance analysis proves it worthwhile should a ValueTask<TResult> be used instead of a Task<TResult>. Не универсальная версия ValueTask не рекомендуется для большинства сценариев.The non generic version of ValueTask is not recommended for most scenarios. CompletedTask Свойство должно использоваться передаваемое обратно в случае успешного завершения одноэлементный там, где метод возвратить Task завершается синхронно и успешно.The CompletedTask property should be used to hand back a successfully completed singleton in the case where a method returning a Task completes synchronously and successfully.

Примечание

Использование ValueTask<TResult> тип поддерживается, начиная с C# 7.0 и не поддерживается в любой версии Visual Basic.The use of the ValueTask<TResult> type is supported starting with C# 7.0, and is not supported by any version of Visual Basic.

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

ValueTask<TResult>(Task<TResult>) ValueTask<TResult>(Task<TResult>) ValueTask<TResult>(Task<TResult>) ValueTask<TResult>(Task<TResult>)

Инициализирует новый экземпляр класса ValueTask<TResult>, используя указанную задачу, которая представляет операцию.Initializes a new instance of the ValueTask<TResult> class using the supplied task that represents the operation.

ValueTask<TResult>(TResult) ValueTask<TResult>(TResult) ValueTask<TResult>(TResult) ValueTask<TResult>(TResult)

Инициализирует новый экземпляр класса ValueTask<TResult>, используя указанный результат успешной операции.Initializes a new instance of the ValueTask<TResult> class using the supplied result of a successful operation.

ValueTask<TResult>(IValueTaskSource<TResult>, Int16) ValueTask<TResult>(IValueTaskSource<TResult>, Int16) ValueTask<TResult>(IValueTaskSource<TResult>, Int16) ValueTask<TResult>(IValueTaskSource<TResult>, Int16)

Свойства

IsCanceled IsCanceled IsCanceled IsCanceled

Возвращает значение, указывающее, представляет ли этот объект отмененную операцию.Gets a value that indicates whether this object represents a canceled operation.

IsCompleted IsCompleted IsCompleted IsCompleted

Возвращает значение, указывающее, представляет ли этот объект завершенную операцию.Gets a value that indicates whether this object represents a completed operation.

IsCompletedSuccessfully IsCompletedSuccessfully IsCompletedSuccessfully IsCompletedSuccessfully

Возвращает значение, указывающее, представляет ли этот объект успешно завершенную операцию.Gets a value that indicates whether this object represents a successfully completed operation.

IsFaulted IsFaulted IsFaulted IsFaulted

Возвращает значение, указывающее, представляет ли этот объект операцию, завершившуюся ошибкой.Gets a value that indicates whether this object represents a failed operation.

Result Result Result Result

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

Методы

AsTask() AsTask() AsTask() AsTask()

Получает объект Task<TResult>, который представляет ValueTask<TResult>.Retrieves a Task<TResult> object that represents this ValueTask<TResult>.

ConfigureAwait(Boolean) ConfigureAwait(Boolean) ConfigureAwait(Boolean) ConfigureAwait(Boolean)

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

CreateAsyncMethodBuilder() CreateAsyncMethodBuilder() CreateAsyncMethodBuilder() CreateAsyncMethodBuilder()

Создает построитель метода для использования с асинхронным методом.Creates a method builder for use with an async method.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

Equals(ValueTask<TResult>) Equals(ValueTask<TResult>) Equals(ValueTask<TResult>) Equals(ValueTask<TResult>)

Определяет, равен ли заданный объект ValueTask<TResult> текущему объекту ValueTask<TResult>.Determines whether the specified ValueTask<TResult> object is equal to the current ValueTask<TResult> object.

GetAwaiter() GetAwaiter() GetAwaiter() GetAwaiter()

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

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Возвращает хэш-код данного экземпляра.Returns the hash code for this instance.

Preserve() Preserve() Preserve() Preserve()
ToString() ToString() ToString() ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

Операторы

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

Сравнивает два значения на предмет их равенства.Compares two values for equality.

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

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

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