ValueTask<TResult> Estrutura

Definição

Fornece um tipo de valor que encapsula um Task<TResult> e um TResult, apenas um dos quais é 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

TResult

O resultado.

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

Comentários

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

As seguintes operações nunca devem ser executadas em uma ValueTask<TResult> instância:

  • Aguardando a instância várias vezes.
  • Chamando AsTask várias vezes.
  • Usar .Result ou .GetAwaiter().GetResult() quando a operação ainda não tiver sido concluída ou usá-la várias vezes.
  • Usando mais de uma dessas técnicas para consumir a instância.

Se você fizer qualquer uma das opções acima, os resultados serão indefinidos.

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

Há compensações para usar um ValueTask<TResult> em vez de um Task<TResult>. Por exemplo, enquanto um ValueTask<TResult> pode ajudar a evitar uma alocação no caso em que o resultado bem-sucedido está disponível de forma síncrona, ele também contém vários campos, enquanto um Task<TResult> tipo de referência é um único campo. Isso significa que retornar um ValueTask<TResult> de um método resulta na cópia de mais dados. Isso também significa que, se um método que retorna um ValueTask<TResult> é aguardado dentro de um método assíncrono, o computador de estado para esse método assíncrono será maior, pois ele deve armazenar um struct que contém vários campos em vez de uma única referência.

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

Dessa forma, a opção padrão para qualquer método assíncrono deve ser retornar um Task ou Task<TResult>. Somente se a análise de desempenho provar que vale a pena deve ValueTask<TResult> ser usada em vez de uma Task<TResult>. A versão não genérica não é recomendada para a maioria dos ValueTask cenários. A CompletedTask propriedade deve ser usada para devolver um singleton concluído com êxito no caso em que um método retornando uma Task conclusão síncrona e bem-sucedida.

Note

O uso do tipo ValueTask<TResult> tem suporte a partir do C# 7.0 e não é compatível com 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 inicializada zero) representa uma operação de forma síncrona e concluída com êxito com o resultado de default(TResult).

Construtores

Nome 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

Nome Description
IsCanceled

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

IsCompleted

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

IsCompletedSuccessfully

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

IsFaulted

Obtém um valor que indica se esse objeto representa uma operação com falha.

Result

Obtém o resultado.

Métodos

Nome Description
AsTask()

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

ConfigureAwait(Boolean)

Configura um aguardador para esse 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 awaiter para esse valor.

GetHashCode()

Retorna o código hash dessa instância.

Preserve()

Obtém um ValueTask<TResult> que pode ser usado a qualquer momento no futuro.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

Operadores

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

Compara dois valores de igualdade.

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

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

Aplica-se a