ValueTask<TResult> Struktura
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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
- 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. |