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.Provides a value type that wraps a Task<TResult> and a TResult, only one of which is used.

generic <typename TResult>
public value class ValueTask : 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.The result.

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

Commenti

Un' ValueTask<TResult> istanza può essere attesa o convertita in un oggetto Task<TResult> utilizzando AsTask.A ValueTask<TResult> instance may either be awaited or converted to a Task<TResult> using AsTask. Un' ValueTask<TResult> istanza può essere attesa solo una volta e gli utenti potrebbero non chiamare GetAwaiter() finché l'istanza non è stata completata.A ValueTask<TResult> instance may only be awaited once, and consumers may not call GetAwaiter() until the instance has completed. Se queste limitazioni non sono accettabili, convertire l' ValueTask<TResult> oggetto in Task<TResult> un oggetto AsTaskchiamando.If these limitations are unacceptable, convert the ValueTask<TResult> to a Task<TResult> by calling AsTask.

Le operazioni seguenti non devono mai essere eseguite in ValueTask<TResult> un'istanza:The following operations should never be performed on a ValueTask<TResult> instance:

  • In attesa dell'istanza più volte.Awaiting the instance multiple times.
  • Chiamata AsTask più volte.Calling AsTask multiple times.
  • Utilizzando .Result o.GetAwaiter().GetResult() quando l'operazione non è stata ancora completata o utilizzando più volte.Using .Result or .GetAwaiter().GetResult() when the operation hasn't yet completed, or using them multiple times.
  • Utilizzo di più di una di queste tecniche per utilizzare l'istanza di.Using more than one of these techniques to consume the instance.

Se si esegue una delle operazioni descritte in precedenza, i risultati non sono definiti.If you do any of the above, the results are undefined.

Un metodo può restituire un'istanza di questo tipo di valore quando è probabile che il risultato della relativa operazione sarà disponibile in modo sincrono e quando dovrebbe essere richiamato così frequentemente che il costo di allocazione di un nuovo Task<TResult> oggetto per ogni chiamata sarà proibitivo.A method may return an instance of this value type when it's likely that the result of its operation will be available synchronously, and when it's expected to be invoked so frequently that the cost of allocating a new Task<TResult> for each call will be prohibitive.

Ci sono compromessi nell'uso di ValueTask<TResult> un anziché di Task<TResult>un oggetto.There are tradeoffs to using a ValueTask<TResult> instead of a Task<TResult>. Ad esempio, mentre un ValueTask<TResult> oggetto può aiutare a evitare un'allocazione nel caso in cui il risultato sia disponibile in modo sincrono, contiene anche più campi Task<TResult> , mentre un come tipo di riferimento è un singolo campo.For example, while a ValueTask<TResult> can help avoid an allocation in the case where the successful result is available synchronously, it also contains multiple fields, whereas a Task<TResult> as a reference type is a single field. Ciò significa che la restituzione di un oggetto ValueTask<TResult> da un metodo comporta la copia di più dati.This means that returning a ValueTask<TResult> from a method results in copying more data. Ciò significa anche che se un metodo che restituisce un ValueTask<TResult> è atteso all'interno di un metodo asincrono, la macchina a stati per quel metodo asincrono sarà più grande, perché deve archiviare uno struct contenente più campi anziché un singolo riferimento.It also means, that if a method that returns a ValueTask<TResult> is awaited within an async method, the state machine for that async method will be larger, because it must store a struct containing multiple fields instead of a single reference.

Per gli utilizzi diversi dall'utilizzo del risultato di un'operazione asincrona tramite await, ValueTask<TResult> può causare un modello di programmazione più complesso che richiede più allocazioni.For uses other than consuming the result of an asynchronous operation using await, ValueTask<TResult> can lead to a more convoluted programming model that requires more allocations. Si consideri, ad esempio, un metodo che Task<TResult> può restituire un oggetto con un'attività memorizzata nella ValueTask<TResult>cache come risultato comune o.For example, consider a method that could return either a Task<TResult> with a cached task as a common result or a ValueTask<TResult>. Se il consumer del risultato desidera Task<TResult> utilizzarlo come in un metodo come WhenAll o WhenAny Task<TResult> , ValueTask<TResult> deve essere prima convertito in utilizzando AsTask, causando un'allocazione che sarebbe stata evitata se nella Task<TResult> prima posizione è stata usata la cache.If the consumer of the result wants to use it as a Task<TResult> in a method like WhenAll or WhenAny, the ValueTask<TResult> must first be converted to a Task<TResult> using AsTask, leading to an allocation that would have been avoided if a cached Task<TResult> had been used in the first place.

Di conseguenza, l'opzione predefinita per qualsiasi metodo asincrono deve essere per restituire un Task oggetto Task<TResult>o.As such, the default choice for any asynchronous method should be to return a Task or Task<TResult>. Solo se l'analisi delle prestazioni dimostra che vale la ValueTask<TResult> pena usare un oggetto anziché Task<TResult>un oggetto.Only if performance analysis proves it worthwhile should a ValueTask<TResult> be used instead of a Task<TResult>. La versione non generica ValueTask di non è consigliata per la maggior parte degli scenari.The non generic version of ValueTask is not recommended for most scenarios. La CompletedTask proprietà deve essere utilizzata per restituire un singleton completato correttamente nel caso in cui un metodo che restituisce un Task oggetto venga completato in modo sincrono e correttamente.The CompletedTask property should be used to hand back a successfully completed singleton in the case where a method returning a Task completes synchronously and successfully.

Nota

L'uso del ValueTask<TResult> tipo è supportato a partire da C# 7,0 e non è supportato da alcuna versione di Visual Basic.The use of the ValueTask<TResult> type is supported starting with C# 7.0, and is not supported by any version of Visual Basic.

Costruttori

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

Inizializza una nuova istanza della classe ValueTask<TResult> con un oggetto IValueTaskSource<TResult> che rappresenta l'operazione.Initializes a new instance of the ValueTask<TResult> class with a IValueTaskSource<TResult> object that represents the operation.

ValueTask<TResult>(Task<TResult>)

Inizializza una nuova istanza della classe ValueTask<TResult> usando l'attività specificata che rappresenta l'operazione.Initializes a new instance of the ValueTask<TResult> class using the supplied task that represents the operation.

ValueTask<TResult>(TResult)

Inizializza una nuova istanza della classe ValueTask<TResult> usando il risultato specificato di un'operazione riuscita.Initializes a new instance of the ValueTask<TResult> class using the supplied result of a successful operation.

Proprietà

IsCanceled

Ottiene un valore che indica se l'oggetto rappresenta un'operazione annullata.Gets a value that indicates whether this object represents a canceled operation.

IsCompleted

Ottiene un valore che indica se l'oggetto rappresenta un'operazione completata.Gets a value that indicates whether this object represents a completed operation.

IsCompletedSuccessfully

Ottiene un valore che indica se l'oggetto rappresenta un'operazione completata correttamente.Gets a value that indicates whether this object represents a successfully completed operation.

IsFaulted

Ottiene un valore che indica se l'oggetto rappresenta un'operazione non riuscita.Gets a value that indicates whether this object represents a failed operation.

Result

Ottiene il risultato.Gets the result.

Metodi

AsTask()

Recupera un oggetto Task<TResult> che rappresenta questo ValueTask<TResult>.Retrieves a Task<TResult> object that represents this ValueTask<TResult>.

ConfigureAwait(Boolean)

Configura un elemento awaiter per questo valore.Configures an awaiter for this value.

CreateAsyncMethodBuilder()

Crea un generatore di metodo da usare con un metodo asincrono.Creates a method builder for use with an async method.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.Determines whether the specified object is equal to the current object.

Equals(ValueTask<TResult>)

Determina se l'oggetto ValueTask<TResult> specificato equivale all'oggetto ValueTask<TResult> corrente.Determines whether the specified ValueTask<TResult> object is equal to the current ValueTask<TResult> object.

GetAwaiter()

Crea un elemento awaiter per questo valore.Creates an awaiter for this value.

GetHashCode()

Restituisce il codice hash per l'istanza.Returns the hash code for this instance.

Preserve()

Ottiene un oggetto ValueTask<TResult> che può essere usato in qualsiasi momento nel futuro.Gets a ValueTask<TResult> that may be used at any point in the future.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.Returns a string that represents the current object.

Operatori

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

Confronta due valori per stabilirne l'uguaglianza.Compares two values for equality.

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

Determina se due valori ValueTask<TResult> sono diversi.Determines whether two ValueTask<TResult> values are unequal.

Si applica a