Compartilhar via


ValueTask<TResult> Estrutura

Definição

Fornece um tipo de valor que encapsula um Task<TResult> e um TResult. Somente um de cada é 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>>
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

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-a ValueTask<TResult> em uma Task<TResult> chamada.AsTask

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

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

Se você fizer qualquer um dos resultados 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 que 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 o retorno de um ValueTask<TResult> 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 ValueTask<TResult> , deve 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.

Assim, 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.

Observação

O uso do ValueTask<TResult> tipo tem suporte a partir do C# 7.0 e não tem suporte em nenhuma versão do Visual Basic.

Observação

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

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

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

ValueTask<TResult>(Task<TResult>)

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

ValueTask<TResult>(TResult)

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

Propriedades

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 êxito.

IsFaulted

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

Result

Obtém o resultado.

Métodos

AsTask()

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

ConfigureAwait(Boolean)

Configura um awaiter para esse valor.

CreateAsyncMethodBuilder()

Cria um construtor de método para ser usado com um método assíncrono.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

Equals(ValueTask<TResult>)

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

GetAwaiter()

Cria um awaiter para esse valor.

GetHashCode()

Retorna o código hash para a instância.

Preserve()

Obtém uma ValueTask<TResult> que pode ser usada em qualquer momento no futuro.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

Operadores

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

Compara dois valores quanto à igualdade.

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

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

Aplica-se a