Compartir a través de


ValueTask<TResult> Estructura

Definición

Proporciona un tipo de valor que encapsula un Task<TResult> y un TResult(solo se usa uno de ellos).

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))

Parámetros de tipo

TResult

Resultado.

Herencia
ValueTask<TResult>
Implementaciones
IEquatable<ValueTask<TResult>>

Comentarios

Una ValueTask<TResult> instancia de puede esperarse o convertirse en mediante Task<TResult> AsTask. Una ValueTask<TResult> instancia solo se puede esperar una vez y los consumidores no pueden leer Result hasta que la instancia se haya completado. Si estas limitaciones son inaceptables, convierta en ValueTask<TResult> a Task<TResult> mediante una llamada a AsTask.

Las siguientes operaciones nunca se deben realizar en una ValueTask<TResult> instancia de :

  • Esperando la instancia varias veces.
  • Llamar varias AsTask veces.
  • Usar .Result o .GetAwaiter().GetResult() cuando la operación aún no se ha completado o usarlas varias veces.
  • Usar más de una de estas técnicas para consumir la instancia.

Si hace alguna de las opciones anteriores, los resultados no están definidos.

Un método puede devolver una instancia de este tipo de valor cuando es probable que el resultado de su operación esté disponible de forma sincrónica y, cuando se espera que se invoque con tanta frecuencia, el costo de asignar una nueva Task<TResult> para cada llamada será prohibitivo.

Hay inconvenientes en el uso de en ValueTask<TResult> lugar de .Task<TResult> Por ejemplo, aunque un ValueTask<TResult> puede ayudar a evitar una asignación en caso de que el resultado correcto esté disponible sincrónicamente, también contiene varios campos, mientras que como Task<TResult> un tipo de referencia es un único campo. Esto significa que devolver un ValueTask<TResult> elemento de un método da lugar a la copia de más datos. También significa que si se espera un método que devuelve un ValueTask<TResult> elemento dentro de un método asincrónico, el equipo de estado de ese método asincrónico será mayor, ya que debe almacenar un struct que contenga varios campos en lugar de una sola referencia.

En el caso de los usos distintos de consumir el resultado de una operación asincrónica mediante await, ValueTask<TResult> puede dar lugar a un modelo de programación más convoluado que requiere más asignaciones. Por ejemplo, considere un método que podría devolver un Task<TResult> con una tarea almacenada en caché como resultado común o .ValueTask<TResult> Si el consumidor del resultado quiere usarlo como en Task<TResult> un método como WhenAll o WhenAny, primero ValueTask<TResult> se debe convertir en un Task<TResult> objeto using AsTask, lo que conduce a una asignación que se habría evitado si se hubiera usado una memoria caché Task<TResult> en primer lugar.

Por lo tanto, la opción predeterminada para cualquier método asincrónico debe ser devolver o Task Task<TResult>. Solo si el análisis de rendimiento demuestra que merece la pena usarse ValueTask<TResult> en lugar de .Task<TResult> La versión no genérica de no se recomienda para la mayoría de ValueTask los escenarios. La CompletedTask propiedad debe utilizarse para devolver un singleton completado correctamente en caso de que un método devuelva un elemento Task completado de forma sincrónica y correcta.

Nota

El uso del ValueTask<TResult> tipo se admite a partir de C# 7.0 y no es compatible con ninguna versión de Visual Basic.

Nota

Una instancia creada con el constructor sin parámetros o por la default(ValueTask<TResult>) sintaxis (una estructura inicializada con cero) representa una operación sincrónica y completada correctamente con el resultado de default(TResult).

Constructores

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

Inicializa una nueva instancia de la clase ValueTask<TResult> con un objeto IValueTaskSource<TResult> que representa la operación.

ValueTask<TResult>(Task<TResult>)

Inicializa una nueva instancia de la clase ValueTask<TResult> usando la tarea suministrada que representa la operación.

ValueTask<TResult>(TResult)

Inicializa una nueva instancia de la clase ValueTask<TResult> usando el resultado suministrado de una operación realizada correctamente.

Propiedades

IsCanceled

Obtiene un valor que indica si este objeto representa una operación cancelada.

IsCompleted

Obtiene un valor que indica si este objeto representa una operación completada.

IsCompletedSuccessfully

Obtiene un valor que indica si este objeto representa una operación completada correctamente.

IsFaulted

Obtiene un valor que indica si este objeto representa una operación con error.

Result

Obtiene el resultado.

Métodos

AsTask()

Recupera un objeto Task<TResult> que representa este ValueTask<TResult>.

ConfigureAwait(Boolean)

Configura un elemento que ejecuta await para este valor.

CreateAsyncMethodBuilder()

Crea un generador de método para usarlo con un método asincrónico.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

Equals(ValueTask<TResult>)

Determina si el objeto ValueTask<TResult> especificado es igual al objeto ValueTask<TResult> actual.

GetAwaiter()

Crea un objeto que ejecuta await para este objeto awaitable.

GetHashCode()

Devuelve el código hash de esta instancia.

Preserve()

Obtiene un ValueTask<TResult> que se puede usar en cualquier momento en el futuro.

ToString()

Devuelve una cadena que representa el objeto actual.

Operadores

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

Compara dos valores para determinar si son iguales.

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

Determina si dos valores ValueTask<TResult> son desiguales.

Se aplica a