ValueTask<TResult> Estrutura
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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
- 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. |