ValueTask<TResult> Estructura
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Proporciona un tipo de valor que encapsula un Task<TResult> y , TResultsolo uno de los cuales se usa.
generic <typename TResult>
public value class ValueTask : IEquatable<System::Threading::Tasks::ValueTask<TResult>>
public readonly 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
El resultado.
- Herencia
- Implementaciones
-
IEquatable<ValueTask<TResult>>
Comentarios
Una ValueTask<TResult> instancia 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 se haya completado la instancia. 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 a AsTask varias veces.
- Uso
.Resulto.GetAwaiter().GetResult()cuando la operación aún no se haya completado o después de 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 sincrónicamente y cuando se espera que se invoque con tanta frecuencia que el costo de asignar un nuevo Task<TResult> para cada llamada será prohibitivo.
Hay inconvenientes en el uso de en ValueTask<TResult> lugar de .Task<TResult> Por ejemplo, aunque puede ValueTask<TResult> ayudar a evitar una asignación en el caso de que el resultado correcto esté disponible de forma sincrónica, 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 como resultado copiar más datos. También significa que si un método que devuelve un ValueTask<TResult> elemento se espera dentro de un método asincrónico, la máquina 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 complicado que requiera 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> debe convertirse 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 TaskTask<TResult>. Solo si el análisis de rendimiento demuestra que merece la ValueTask<TResult> pena usarse en lugar de .Task<TResult> No se recomienda la versión no genérica de para la mayoría de ValueTask los escenarios. La CompletedTask propiedad debe utilizarse para devolver un singleton completado correctamente en el caso de que un método devuelva un Task objeto completado de forma sincrónica y correcta.
Note
El uso del tipo ValueTask<TResult> se admite a partir de C# 7.0 y no es compatible con ninguna versión de Visual Basic.
Note
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
| Nombre | Description |
|---|---|
| ValueTask<TResult>(IValueTaskSource<TResult>, Int16) |
Inicializa una nueva instancia de la ValueTask<TResult> clase con un IValueTaskSource<TResult> objeto que representa la operación. |
| ValueTask<TResult>(Task<TResult>) |
Inicializa una nueva instancia de la ValueTask<TResult> clase utilizando la tarea proporcionada que representa la operación. |
| ValueTask<TResult>(TResult) |
Inicializa una nueva instancia de la ValueTask<TResult> clase utilizando el resultado proporcionado de una operación correcta. |
Propiedades
| Nombre | Description |
|---|---|
| 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
| Nombre | Description |
|---|---|
| AsTask() |
Recupera un Task<TResult> objeto que representa este ValueTask<TResult>objeto . |
| ConfigureAwait(Boolean) |
Configura un awaiter para este valor. |
| Equals(Object) |
Determina si el objeto especificado es igual al objeto actual. |
| Equals(ValueTask<TResult>) |
Determina si el objeto especificado ValueTask<TResult> es igual al objeto actual ValueTask<TResult> . |
| GetAwaiter() |
Crea un awaiter para este valor. |
| GetHashCode() |
Devuelve el código hash de esta instancia. |
| Preserve() |
Obtiene un ValueTask<TResult> objeto que se puede usar en cualquier momento en el futuro. |
| ToString() |
Devuelve una cadena que representa el objeto actual. |
Operadores
| Nombre | Description |
|---|---|
| Equality(ValueTask<TResult>, ValueTask<TResult>) |
Compara dos valores para la igualdad. |
| Inequality(ValueTask<TResult>, ValueTask<TResult>) |
Determina si dos ValueTask<TResult> valores son distintos. |