ValueTask<TResult> Estrutura
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
- 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
.Resultou.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. |