Udostępnij za pośrednictwem


ValueTask<TResult> Struktura

Definicja

Zawiera typ wartości, który opakowuje element Task<TResult> i TResult, z których jest używany tylko jeden.

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

Parametry typu

TResult

Wynik.

Dziedziczenie
ValueTask<TResult>
Implementuje
IEquatable<ValueTask<TResult>>

Uwagi

Wystąpienie ValueTask<TResult> może zostać wyczekiwane lub przekonwertowane na Task<TResult> przy użyciu polecenia AsTask. Wystąpienie ValueTask<TResult> może być oczekiwane tylko raz, a użytkownicy mogą nie odczytywać Result , dopóki wystąpienie nie zostanie ukończone. Jeśli te ograniczenia są niedopuszczalne, przekonwertuj wartość ValueTask<TResult> na element, wywołując metodę Task<TResult>AsTask.

Następujące operacje nigdy nie powinny być wykonywane na wystąpieniu ValueTask<TResult> :

  • Oczekiwanie na wystąpienie wiele razy.
  • Wywoływanie AsTask wiele razy.
  • Użycie .Result lub .GetAwaiter().GetResult() gdy operacja nie została jeszcze ukończona lub użycie ich wiele razy.
  • Używanie więcej niż jednej z tych technik do korzystania z wystąpienia.

Jeśli wykonasz dowolną z powyższych czynności, wyniki są niezdefiniowane.

Metoda może zwrócić wystąpienie tego typu wartości, gdy prawdopodobnie wynik jego operacji będzie dostępny synchronicznie, a gdy oczekuje się, że zostanie wywołany tak często, że koszt przydzielania nowego Task<TResult> dla każdego wywołania będzie zaporowy.

Istnieją kompromisy związane z używaniem Task<TResult>elementu ValueTask<TResult> zamiast . Na przykład chociaż element ValueTask<TResult> może pomóc uniknąć alokacji w przypadku, gdy pomyślny wynik jest dostępny synchronicznie, zawiera również wiele pól, podczas gdy Task<TResult> jako typ odwołania jest jednym polem. Oznacza to, że zwracanie elementu ValueTask<TResult> z metody powoduje skopiowanie większej ilości danych. Oznacza to również, że jeśli metoda zwracająca ValueTask<TResult> obiekt jest oczekiwana w metodzie asynchronicznej, maszyna stanu dla tej metody asynchronicznej będzie większa, ponieważ musi przechowywać strukturę zawierającą wiele pól zamiast pojedynczego odwołania.

W przypadku zastosowań innych niż korzystanie z wyniku operacji asynchronicznej przy użyciu funkcji await może prowadzić do bardziej splotowego modelu programowania, ValueTask<TResult> który wymaga większej liczby alokacji. Rozważmy na przykład metodę, która może zwrócić element Task<TResult> z buforowanym zadaniem jako typowy wynik lub .ValueTask<TResult> Jeśli użytkownik wyniku chce użyć go jako Task<TResult> metody podobnej WhenAll do lub WhenAny, ValueTask<TResult> należy najpierw przekonwertować na metodę Task<TResult> przy użyciu metody AsTask, co prowadzi do alokacji, która byłaby unikana, gdyby pamięć podręczna Task<TResult> była używana w pierwszej kolejności.

W związku z tym domyślnym wyborem dla dowolnej metody asynchronicznej powinno być zwrócenie wartości Task lub Task<TResult>. Tylko wtedy, gdy analiza wydajności okaże się, że warto ValueTask<TResult> użyć elementu zamiast Task<TResult>. Wersja niegeneryczna nie jest zalecana ValueTask w przypadku większości scenariuszy. Właściwość CompletedTask powinna służyć do przekazania pomyślnego ukończenia pojedynczego w przypadku, gdy metoda zwracająca synchronicznie i pomyślnie wykonaną metodę Task .

Uwaga

Użycie ValueTask<TResult> typu jest obsługiwane począwszy od języka C# 7.0 i nie jest obsługiwane przez żadną wersję języka Visual Basic.

Uwaga

Wystąpienie utworzone za pomocą konstruktora bez parametrów lub default(ValueTask<TResult>) składni (struktura zainicjowana bez parametrów) reprezentuje synchronicznie ukończoną operację z wynikiem default(TResult).

Konstruktory

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

Inicjuje ValueTask<TResult> nowe wystąpienie klasy z obiektem reprezentującym IValueTaskSource<TResult> operację.

ValueTask<TResult>(Task<TResult>)

Inicjuje ValueTask<TResult> nowe wystąpienie klasy przy użyciu dostarczonego zadania, które reprezentuje operację.

ValueTask<TResult>(TResult)

Inicjuje ValueTask<TResult> nowe wystąpienie klasy przy użyciu podanego wyniku pomyślnej operacji.

Właściwości

IsCanceled

Pobiera wartość wskazującą, czy ten obiekt reprezentuje anulowaną operację.

IsCompleted

Pobiera wartość wskazującą, czy ten obiekt reprezentuje ukończoną operację.

IsCompletedSuccessfully

Pobiera wartość wskazującą, czy ten obiekt reprezentuje pomyślnie ukończoną operację.

IsFaulted

Pobiera wartość wskazującą, czy ten obiekt reprezentuje operację, która zakończyła się niepowodzeniem.

Result

Pobiera wynik.

Metody

AsTask()

Task<TResult> Pobiera obiekt reprezentujący ten ValueTask<TResult>element .

ConfigureAwait(Boolean)

Konfiguruje obiekt awaiter dla tej wartości.

CreateAsyncMethodBuilder()

Tworzy konstruktora metod do użycia z metodą asynchroniową.

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

Equals(ValueTask<TResult>)

Określa, czy określony ValueTask<TResult> obiekt jest równy bieżącemu ValueTask<TResult> obiektowi.

GetAwaiter()

Tworzy obiekt awaiter dla tej wartości.

GetHashCode()

Zwraca wartość skrótu dla tego wystąpienia.

Preserve()

Pobiera element ValueTask<TResult> , który może być używany w dowolnym momencie w przyszłości.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

Operatory

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

Porównuje dwie wartości równości.

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

Określa, czy dwie ValueTask<TResult> wartości są nierówne.

Dotyczy