ValueTask<TResult> Struktura
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Poskytuje typ hodnoty, který zabalí Task<TResult> a TResult, pouze jeden z nich se používá.
generic <typename TResult>
public value class ValueTask : IEquatable<System::Threading::Tasks::ValueTask<TResult>>
public readonly 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
Výsledek.
- Dědičnost
- Implementuje
-
IEquatable<ValueTask<TResult>>
Poznámky
Instance ValueTask<TResult> může být buď očekávána, nebo převedena Task<TResult> na using AsTask. Instance ValueTask<TResult> může být očekávána pouze jednou a příjemci nemusí číst Result , dokud se instance nedokončí. Pokud tato omezení jsou nepřijatelná, převeďte na ValueTask<TResult> volání Task<TResult>AsTask.
V instanci by se nikdy neměly provádět ValueTask<TResult> následující operace:
- Čekání na instanci několikrát.
- Volání AsTask několikrát.
- Použití
.Resultnebo.GetAwaiter().GetResult()v případě, že se operace ještě nedokončila, nebo je používáte několikrát. - Použití více než jedné z těchto technik k využití instance.
Pokud provedete některý z výše uvedených kroků, výsledky nebudou definovány.
Metoda může vrátit instanci tohoto typu hodnoty, pokud je pravděpodobné, že výsledek jeho operace bude k dispozici synchronně, a když se očekává, že bude vyvolána tak často, že náklady na přidělení nové Task<TResult> pro každé volání budou zakázány.
Existují kompromisy k použití ValueTask<TResult> místo Task<TResult>. I když ValueTask<TResult> například může pomoct vyhnout se přidělení v případě, že úspěšný výsledek je k dispozici synchronně, obsahuje také více polí, zatímco Task<TResult> jako typ odkazu je jedno pole. To znamená, že vrácení ValueTask<TResult> metody vede ke kopírování dalších dat. To také znamená, že pokud metoda, která vrací ValueTask<TResult> , je očekávána v rámci asynchronní metody, stavový počítač pro tuto asynchronní metodu bude větší, protože musí uložit strukturu obsahující více polí namísto jediného odkazu.
Pro použití jiné než využívání výsledku asynchronní operace pomocí operátoru await ValueTask<TResult> může vést k více konvolutovaným programovacímu modelu, který vyžaduje více přidělení. Představte si například metodu, která by mohla jako běžný výsledek nebo jako ValueTask<TResult>běžný výsledek vrátit úkol Task<TResult> s mezipamětí. Pokud chce příjemce výsledku použít jako Task<TResult> metodu jako WhenAll nebo WhenAny, ValueTask<TResult> musí se nejprve převést na Task<TResult> použití AsTask, což by vedlo k přidělení, kterému by se zabránilo, kdyby se na prvním místě použila Task<TResult> mezipaměť.
Jako takový, výchozí volba pro jakoukoli asynchronní metodu by měla být vrátit nebo TaskTask<TResult>. Pouze pokud analýza výkonu prokáže, že je ValueTask<TResult> vhodné použít místo Task<TResult>. Pro většinu scénářů se nedoporučuje obecná verze ValueTask . Vlastnost CompletedTask by se měla použít k předání úspěšně dokončeného singletonu v případě, že metoda vracející Task dokončení synchronně a úspěšně.
Note
Použití typu ValueTask<TResult> je podporováno od jazyka C# 7.0 a není podporováno žádnou verzí Visual Basic.
Note
Instance vytvořená pomocí konstruktoru bez parametrů nebo default(ValueTask<TResult>) syntaxe (struktura s nulovou inicializovanou strukturou) představuje synchronně, úspěšně dokončenou operaci s výsledkem default(TResult).
Konstruktory
| Name | Description |
|---|---|
| ValueTask<TResult>(IValueTaskSource<TResult>, Int16) |
Inicializuje novou instanci ValueTask<TResult> třídy s IValueTaskSource<TResult> objektem, který představuje operaci. |
| ValueTask<TResult>(Task<TResult>) |
Inicializuje novou instanci ValueTask<TResult> třídy pomocí zadané úlohy, která představuje operaci. |
| ValueTask<TResult>(TResult) |
Inicializuje novou instanci ValueTask<TResult> třídy pomocí zadaného výsledku úspěšné operace. |
Vlastnosti
| Name | Description |
|---|---|
| IsCanceled |
Získá hodnotu, která označuje, zda tento objekt představuje zrušenou operaci. |
| IsCompleted |
Získá hodnotu, která označuje, zda tento objekt představuje dokončenou operaci. |
| IsCompletedSuccessfully |
Získá hodnotu, která označuje, zda tento objekt představuje úspěšně dokončenou operaci. |
| IsFaulted |
Získá hodnotu, která označuje, zda tento objekt představuje neúspěšnou operaci. |
| Result |
Získá výsledek. |
Metody
| Name | Description |
|---|---|
| AsTask() |
Načte Task<TResult> objekt, který představuje tento ValueTask<TResult>objekt . |
| ConfigureAwait(Boolean) |
Nakonfiguruje pro tuto hodnotu operátor awaiter. |
| Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. |
| Equals(ValueTask<TResult>) |
Určuje, zda je zadaný ValueTask<TResult> objekt roven aktuálnímu ValueTask<TResult> objektu. |
| GetAwaiter() |
Vytvoří pro tuto hodnotu awaiter. |
| GetHashCode() |
Vrátí kód hash pro tuto instanci. |
| Preserve() |
ValueTask<TResult> Získá, který lze použít v libovolném okamžiku v budoucnu. |
| ToString() |
Vrátí řetězec, který představuje aktuální objekt. |
Operátory
| Name | Description |
|---|---|
| Equality(ValueTask<TResult>, ValueTask<TResult>) |
Porovná dvě hodnoty rovnosti. |
| Inequality(ValueTask<TResult>, ValueTask<TResult>) |
Určuje, zda jsou dvě ValueTask<TResult> hodnoty nerovné. |