Condividi tramite


ValueTask<TResult> Struct

Definizione

Fornisce un tipo valore che esegue il wrapping di un oggetto Task<TResult> e di un oggetto TResult, di cui ne viene usato uno solo.

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))

Parametri di tipo

TResult

Risultato.

Ereditarietà
ValueTask<TResult>
Implementazioni
IEquatable<ValueTask<TResult>>

Commenti

Un'istanza ValueTask<TResult> di può essere attesa o convertita in un Task<TResult> oggetto utilizzando AsTask. Un'istanza ValueTask<TResult> può essere attesa una sola volta e i consumer potrebbero non leggere Result finché l'istanza non è stata completata. Se queste limitazioni non sono accettabili, convertire in ValueTask<TResult> un oggetto Task<TResult> chiamando AsTask.

Le operazioni seguenti non devono mai essere eseguite su un'istanza ValueTask<TResult> di :

  • In attesa dell'istanza più volte.
  • Chiamata AsTask più volte.
  • Uso .Result di o .GetAwaiter().GetResult() quando l'operazione non è ancora stata completata o usarla più volte.
  • Utilizzo di più di una di queste tecniche per utilizzare l'istanza di .

Se si esegue una delle operazioni precedenti, i risultati non sono definiti.

Un metodo può restituire un'istanza di questo tipo di valore quando è probabile che il risultato dell'operazione sia disponibile in modo sincrono e quando è previsto che venga richiamato così frequentemente il costo dell'allocazione di un nuovo Task<TResult> per ogni chiamata sarà proibitivo.

Esistono compromessi per l'uso di un ValueTask<TResult> oggetto anziché di un oggetto Task<TResult>. Ad esempio, mentre un ValueTask<TResult> oggetto può aiutare a evitare un'allocazione nel caso in cui il risultato riuscito sia disponibile in modo sincrono, contiene anche più campi, mentre un Task<TResult> come tipo di riferimento è un singolo campo. Ciò significa che la restituzione di un ValueTask<TResult> oggetto da un metodo comporta la copia di più dati. Significa anche che se un metodo che restituisce un ValueTask<TResult> oggetto è atteso all'interno di un metodo asincrono, la macchina a stati per tale metodo asincrono sarà più grande, perché deve archiviare uno struct contenente più campi anziché un singolo riferimento.

Per gli usi diversi dall'utilizzo del risultato di un'operazione asincrona tramite await, ValueTask<TResult> può comportare un modello di programmazione più convoluibile che richiede più allocazioni. Si consideri ad esempio un metodo che può restituire un Task<TResult> oggetto con un'attività memorizzata nella cache come risultato comune o .ValueTask<TResult> Se il consumer del risultato vuole usarlo come Task<TResult> in un metodo come WhenAll o WhenAny, deve ValueTask<TResult> prima essere convertito in un Task<TResult> oggetto utilizzando AsTask, causando un'allocazione che sarebbe stata evitata se fosse stato usato un oggetto memorizzato Task<TResult> nella cache.

Di conseguenza, la scelta predefinita per qualsiasi metodo asincrono deve essere quella di restituire un Task oggetto o Task<TResult>. Solo se l'analisi delle prestazioni dimostra che è utile ValueTask<TResult> usare anziché .Task<TResult> La versione non generica di ValueTask non è consigliata per la maggior parte degli scenari. La CompletedTask proprietà deve essere utilizzata per eseguire il rollback di un singleton completato correttamente nel caso in cui un metodo restituisca un Task oggetto completato in modo sincrono e corretto.

Nota

L'uso del ValueTask<TResult> tipo è supportato a partire da C# 7.0 e non è supportato da alcuna versione di Visual Basic.

Nota

Un'istanza creata con il costruttore senza parametri o dalla default(ValueTask<TResult>) sintassi (una struttura inizializzata zero) rappresenta un'operazione completata in modo sincrono con il risultato di default(TResult).

Costruttori

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

Inizializza una nuova istanza della classe ValueTask<TResult> con un oggetto IValueTaskSource<TResult> che rappresenta l'operazione.

ValueTask<TResult>(Task<TResult>)

Inizializza una nuova istanza della classe ValueTask<TResult> usando l'attività specificata che rappresenta l'operazione.

ValueTask<TResult>(TResult)

Inizializza una nuova istanza della classe ValueTask<TResult> usando il risultato specificato di un'operazione riuscita.

Proprietà

IsCanceled

Ottiene un valore che indica se l'oggetto rappresenta un'operazione annullata.

IsCompleted

Ottiene un valore che indica se l'oggetto rappresenta un'operazione completata.

IsCompletedSuccessfully

Ottiene un valore che indica se l'oggetto rappresenta un'operazione completata correttamente.

IsFaulted

Ottiene un valore che indica se l'oggetto rappresenta un'operazione non riuscita.

Result

Ottiene il risultato.

Metodi

AsTask()

Recupera un oggetto Task<TResult> che rappresenta questo ValueTask<TResult>.

ConfigureAwait(Boolean)

Configura un elemento awaiter per questo valore.

CreateAsyncMethodBuilder()

Crea un generatore di metodo da usare con un metodo asincrono.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

Equals(ValueTask<TResult>)

Determina se l'oggetto ValueTask<TResult> specificato equivale all'oggetto ValueTask<TResult> corrente.

GetAwaiter()

Crea un elemento awaiter per questo valore.

GetHashCode()

Restituisce il codice hash per l'istanza.

Preserve()

Ottiene un oggetto ValueTask<TResult> che può essere usato in qualsiasi momento nel futuro.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

Operatori

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

Confronta due valori per stabilirne l'uguaglianza.

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

Determina se due valori ValueTask<TResult> sono diversi.

Si applica a