ValueTask<TResult> 結構
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
提供包裝 Task<TResult> 和 TResult
的實值型別,只會使用其中之一。
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))
類型參數
- TResult
結果。
- 繼承
- 實作
-
IEquatable<ValueTask<TResult>>
備註
ValueTask<TResult>實例可以使用 等候或轉換成 Task<TResult>AsTask 。 ValueTask<TResult>實例只能等候一次,而且取用者在實例完成之前可能不會讀取 Result 。 如果無法接受這些限制,請呼叫 AsTask 將 ValueTask<TResult>Task<TResult> 轉換為 。
在 實例上 ValueTask<TResult> 不應執行下列作業:
- 等候實例多次。
- 多次呼叫 AsTask 。
- 使用
.Result
或.GetAwaiter().GetResult()
作業尚未完成時,或使用多次。 - 使用其中一種以上的技術來取用 實例。
如果您執行上述任一動作,則結果未定義。
方法可能會在作業的結果同步使用時,傳回這個實數值型別的實例,而且預期叫用這個數值型別的成本會非常頻繁,因此每個呼叫的配置新 Task<TResult> 成本將會是禁止的。
使用 而不是 Task<TResult> 有取 ValueTask<TResult> 舍。 例如,雖然 可以 ValueTask<TResult> 協助避免在成功的結果同步使用的情況下配置,但它也會包含多個欄位,而 Task<TResult> 做為參考型別的 則是單一欄位。 這表示從方法傳 ValueTask<TResult> 回 會導致複製更多資料。 這也表示,如果傳回 ValueTask<TResult> a 的方法在非同步方法內等候,該非同步方法的狀態機器將會較大,因為它必須儲存包含多個欄位的結構,而不是單一參考。
對於使用 await 來取用非同步作業結果以外的用途, ValueTask<TResult> 可能會導致需要更多配置的卷積程式設計模型。 例如,假設有方法可以傳回 Task<TResult> 具有快取工作的 ,做為一般結果或 ValueTask<TResult> 。 如果結果的取用者想要在 或 WhenAllWhenAny 等方法中使用它做為 Task<TResult> , ValueTask<TResult> 則必須先使用 轉換成 Task<TResult> , AsTask 導致在第一個位置使用快取 Task<TResult> 時避免的配置。
因此,任何非同步方法的預設選擇應該是傳回 Task 或 Task<TResult> 。 只有在效能分析證明應該使用 而不是 時,才值得 ValueTask<TResult> 使用 Task<TResult> 。 在大部分情況下,不建議使用 的非泛型版本 ValueTask 。 CompletedTask當方法傳回同步且順利完成時,應該使用 屬性來傳回成功完成的單一 Task 。
注意
從 C# 7.0 開始,支援使用 ValueTask<TResult> 類型,且不受任何 Visual Basic 版本支援。
注意
使用無參數建構函式或語法 default(ValueTask<TResult>)
建立的實例, (零初始化的結構) 代表同步、成功完成且結果為 的 default(TResult)
作業。
建構函式
ValueTask<TResult>(IValueTaskSource<TResult>, Int16) |
使用代表作業的 IValueTaskSource<TResult> 物件初始化 ValueTask<TResult> 類別的新執行個體。 |
ValueTask<TResult>(Task<TResult>) |
使用所提供之代表作業的工作,初始化 ValueTask<TResult> 類別的新執行個體。 |
ValueTask<TResult>(TResult) |
使用所提供之成功作業的結果,初始化 ValueTask<TResult> 類別的新執行個體。 |
屬性
IsCanceled |
取得值,指出這個物件是否代表已取消的作業。 |
IsCompleted |
取得值,指出這個物件是否代表已完成的作業。 |
IsCompletedSuccessfully |
取得值,指出這個物件是否代表已成功完成的作業。 |
IsFaulted |
取得值,指出這個物件是否代表失敗的作業。 |
Result |
取得結果。 |
方法
AsTask() |
擷取代表這個 ValueTask<TResult> 的 Task<TResult> 物件。 |
ConfigureAwait(Boolean) |
設定此值的 awaiter。 |
CreateAsyncMethodBuilder() |
建立搭配非同步方法使用的方法產生器。 |
Equals(Object) |
判斷指定的物件是否等於目前的物件。 |
Equals(ValueTask<TResult>) |
判斷指定的 ValueTask<TResult> 物件是否等於目前的 ValueTask<TResult> 物件。 |
GetAwaiter() |
建立此值的 awaiter。 |
GetHashCode() |
傳回這個執行個體的雜湊碼。 |
Preserve() |
取得未來可以隨時使用的 ValueTask<TResult>。 |
ToString() |
傳回代表目前物件的字串。 |
運算子
Equality(ValueTask<TResult>, ValueTask<TResult>) |
比較兩個值是否相等。 |
Inequality(ValueTask<TResult>, ValueTask<TResult>) |
判斷兩個 ValueTask<TResult> 值是否不相等。 |