ValueTask<TResult> Estrutura

Definição

Fornece um tipo de valor que envolve a Task<TResult> e um TResult, dos quais apenas um é usado.

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 Genérico

TResult

O resultado.

Herança
ValueTask<TResult>
Implementações
IEquatable<ValueTask<TResult>>

Observações

Uma ValueTask<TResult> instância pode ser aguardada ou convertida em um Task<TResult> usando AsTask. Uma ValueTask<TResult> instância só pode ser aguardada uma vez, e os consumidores não podem ler Result até que a instância esteja concluída. Se estas limitações forem inaceitáveis, converte o ValueTask<TResult> para a Task<TResult> chamando AsTask.

As seguintes operações nunca devem ser realizadas numa ValueTask<TResult> instância:

  • Estou à espera da instância várias vezes.
  • Liguei AsTask várias vezes.
  • Usar .Result ou .GetAwaiter().GetResult() quando a operação ainda não estiver concluída, ou usá-los várias vezes.
  • Usar mais do que uma destas técnicas para consumir a instância.

Se fizer qualquer uma das situações acima, os resultados ficam indefinidos.

Um método pode devolver uma instância deste tipo de valor quando é provável que o resultado da sua operação esteja disponível de forma síncrona, e quando se espera que seja invocado com tanta frequência que o custo de alocar uma nova Task<TResult> para cada chamada será proibitivo.

Existem compensações em usar um ValueTask<TResult> em vez de um Task<TResult>. Por exemplo, embora a ValueTask<TResult> possa ajudar a evitar uma alocação no caso em que o resultado bem-sucedido esteja disponível de forma síncrona, ele também contém múltiplos campos, enquanto a Task<TResult> como tipo de referência é um único campo. Isto significa que devolver a ValueTask<TResult> de um método resulta na cópia de mais dados. Isto também significa que, se um método que devolve a ValueTask<TResult> for aguardado dentro de um método assíncrono, a máquina de estados desse método assíncrono será maior, porque deve armazenar uma struct contendo múltiplos campos em vez de uma única referência.

Para usos que não sejam consumir o resultado de uma operação assíncrona usando await, ValueTask<TResult> pode levar a um modelo de programação mais complexo que requer mais alocações. Por exemplo, considere um método que poderia devolver a Task<TResult> com uma tarefa em cache como resultado comum ou um ValueTask<TResult>. Se o consumidor do resultado quiser usá-lo como um Task<TResult> num método como WhenAll ou WhenAny, o ValueTask<TResult> deve primeiro ser convertido para um Task<TResult> usando AsTask, levando a uma alocação que teria sido evitada se um cache Task<TResult> tivesse sido usado em primeiro lugar.

Assim, a escolha padrão para qualquer método assíncrono deve ser devolver um Task ou Task<TResult>. Só se a análise de desempenho provar que vale a pena deve ValueTask<TResult> ser usada em vez de um Task<TResult>. A versão ValueTask não genérica não é recomendada para a maioria dos cenários. A CompletedTask propriedade deve ser usada para devolver um singleton concluído com sucesso no caso em que um método que devolve a Task se complete de forma síncrona e bem-sucedida.

Note

A utilização do tipo ValueTask<TResult> é suportada a partir do C# 7.0, e não é suportada por nenhuma versão do Visual Basic.

Note

Uma instância criada com o construtor sem parâmetros ou pela default(ValueTask<TResult>) sintaxe (uma estrutura zero-inicializada) representa uma operação síncrona e bem-sucedida com um resultado de default(TResult).

Construtores

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

Inicializa uma nova instância da ValueTask<TResult> classe com um IValueTaskSource<TResult> objeto que representa a operação.

ValueTask<TResult>(Task<TResult>)

Inicializa uma nova instância da ValueTask<TResult> classe usando a tarefa fornecida que representa a operação.

ValueTask<TResult>(TResult)

Inicializa uma nova instância da ValueTask<TResult> classe usando o resultado fornecido de uma operação bem-sucedida.

Propriedades

Name Description
IsCanceled

Obtém um valor que indica se este objeto representa uma operação cancelada.

IsCompleted

Obtém um valor que indica se este objeto representa uma operação concluída.

IsCompletedSuccessfully

Obtém um valor que indica se este objeto representa uma operação concluída com sucesso.

IsFaulted

Obtém um valor que indica se este objeto representa uma operação falhada.

Result

Obtém o resultado.

Métodos

Name Description
AsTask()

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

ConfigureAwait(Boolean)

Configura um awaiter para este valor.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

Equals(ValueTask<TResult>)

Determina se o objeto especificado ValueTask<TResult> é igual ao objeto atual ValueTask<TResult> .

GetAwaiter()

Cria um servidor para este valor.

GetHashCode()

Devolve o código de hash para esta instância.

Preserve()

Recebe um ValueTask<TResult> que pode ser usado a qualquer momento no futuro.

ToString()

Devolve uma cadeia que representa o objeto atual.

Operadores

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

Compara dois valores para igualdade.

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

Determina se dois ValueTask<TResult> valores são desiguais.

Aplica-se a