ValueTask<TResult> Struct

Definition

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

Type Parameters

TResult

Risultato.The result.

Inheritance
ValueTask<TResult>
Implements
IEquatable<ValueTask<TResult>>

Remarks

Un'istanza di ValueTask<TResult> può essere attesa o convertita in un Task<TResult> utilizzando AsTask.A ValueTask<TResult> instance may either be awaited or converted to a Task<TResult> using AsTask. Un'istanza di ValueTask<TResult> può essere attesa solo una volta e gli utenti potrebbero non leggere Result fino a quando l'istanza non è stata completata.A ValueTask<TResult> instance may only be awaited once, and consumers may not read Result until the instance has completed. Se queste limitazioni non sono accettabili, convertire il ValueTask<TResult> in un Task<TResult> chiamando AsTask.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 un'istanza di ValueTask<TResult>:The following operations should never be performed on a ValueTask<TResult> instance:

  • In attesa dell'istanza più volte.Awaiting the instance multiple times.
  • Chiamata di 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 una nuova Task<TResult> 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.

L'uso di un ValueTask<TResult> invece di un Task<TResult>comporta compromessi.There are tradeoffs to using a ValueTask<TResult> instead of a Task<TResult>. Ad esempio, mentre un ValueTask<TResult> può aiutare a evitare un'allocazione nel caso in cui il risultato sia disponibile in modo sincrono, contiene anche più campi, mentre un Task<TResult> 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 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ò portare a 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 può restituire un Task<TResult> con un'attività memorizzata nella cache come risultato comune o come ValueTask<TResult>.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 utilizzarlo come Task<TResult> in un metodo come WhenAll o WhenAny, è necessario prima convertire il ValueTask<TResult> in una Task<TResult> utilizzando AsTask, causando un'allocazione che sarebbe stata evitata se era stata utilizzata una Task<TResult> memorizzata nella 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, la scelta predefinita per qualsiasi metodo asincrono deve essere restituire un Task o Task<TResult>.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 è opportuno usare un ValueTask<TResult> al posto di un Task<TResult>.Only if performance analysis proves it worthwhile should a ValueTask<TResult> be used instead of a Task<TResult>. La versione non generica di ValueTask non è consigliata per la maggior parte degli scenari.The non generic version of ValueTask is not recommended for most scenarios. È necessario utilizzare la proprietà CompletedTask per restituire un singleton completato correttamente nel caso in cui un metodo che restituisce un Task 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.

Note

L'uso del tipo di ValueTask<TResult> è supportato a partire C# da 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.

Constructors

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.

Properties

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.

Methods

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 relativo a questa 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.

Operators

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.

Applies to