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 。 若這些限制無法接受,則透過呼叫 ValueTask<TResult>將 Task<TResult> 轉換為 。AsTask
以下操作絕不應對任何 ValueTask<TResult> 實例執行:
- 多次等待實例。
- 打了好幾通電話 AsTask 。
- 是使用
.Result.GetAwaiter().GetResult()或在手術尚未完成時,或是多次使用。 - 使用多種技巧來消費實例。
如果你做上述任何一項,結果將無法定義。
當方法的運算結果很可能同步可用,且預期會被頻繁呼叫,導致每次呼叫都需重新分配一個值 Task<TResult> 的成本過高時,可能會回傳此值類型的實例。
使用 a ValueTask<TResult> 而非 Task<TResult>. 有取捨 例如,雖然 a ValueTask<TResult> 在成功結果同步可用時能幫助避免分配,但它同時包含多個欄位,而 a Task<TResult> 作為參考類型則是一個單一欄位。 這表示從某個方法回傳 a ValueTask<TResult> 會導致複製更多資料。 這也代表,如果一個回傳 a ValueTask<TResult> 的方法在非同步方法中等待,該非同步方法的狀態機會更大,因為它必須儲存包含多個欄位的結構,而非單一參考。
對於非使用await處理非同步操作結果以外的用途, ValueTask<TResult> 可能會導致程式設計模型更複雜,需要更多配置。 例如,考慮一個方法,該方法可以回傳帶有快取任務的常見結果,或Task<TResult>返回 ValueTask<TResult> 。 如果結果的消費者想以類似 或 的方法使用它Task<TResult>,必須WhenAll先轉換成WhenAny使用 ValueTask<TResult>,導致若一開始就使用快取Task<TResult>本可避免的配置。AsTaskTask<TResult>
因此,任何非同步方法的預設選擇應是回傳 a Task 或 Task<TResult>。 只有在績效分析證明其值得時,才應使用 a ValueTask<TResult> 代替 Task<TResult>。 大多數情況下不建議使用非通用版本 ValueTask 。 當一個返回 的方法CompletedTask同步且成功完成時,應用來Task回傳成功完成的單例。
Note
從 C# 7.0 起開始支援使用 ValueTask<TResult> 型別,且任何版本的 Visual Basic 都不支援。
Note
使用無參數建構子或語 default(ValueTask<TResult>) 法(零初始化結構)建立的實例,代表同步且成功完成的操作,結果為 default(TResult)。
建構函式
| 名稱 | Description |
|---|---|
| ValueTask<TResult>(IValueTaskSource<TResult>, Int16) |
初始化一個新的類別實例 ValueTask<TResult> ,並以 IValueTaskSource<TResult> 代表該操作的物件。 |
| ValueTask<TResult>(Task<TResult>) |
使用所提供的任務初始化該類別的新實例 ValueTask<TResult> ,該任務代表該操作。 |
| ValueTask<TResult>(TResult) |
利用成功操作的結果初始化該類別的新實例 ValueTask<TResult> 。 |
屬性
| 名稱 | Description |
|---|---|
| IsCanceled |
會得到一個值,指示該物件是否代表已取消的操作。 |
| IsCompleted |
會得到一個值,表示該物件是否代表已完成的操作。 |
| IsCompletedSuccessfully |
會取得一個值,表示該物件是否代表成功完成的操作。 |
| IsFaulted |
會取得一個值,表示該物件是否代表失敗的操作。 |
| Result |
結果就是這樣。 |
方法
| 名稱 | Description |
|---|---|
| AsTask() |
取 Task<TResult> 一個代表此的 ValueTask<TResult>物件。 |
| ConfigureAwait(Boolean) |
為此值配置等待器。 |
| CreateAsyncMethodBuilder() |
建立一個用於非同步方法的方法建構器。 |
| Equals(Object) |
判斷指定的物件是否等於目前的物件。 |
| Equals(ValueTask<TResult>) |
判斷指定的 ValueTask<TResult> 物件是否等於當前 ValueTask<TResult> 物件。 |
| GetAwaiter() |
這會創造一個等待這個價值的玩家。 |
| GetHashCode() |
傳回這個實例的哈希碼。 |
| Preserve() |
拿到 ValueTask<TResult> 一個未來隨時可能使用的。 |
| ToString() |
傳回表示目前 物件的字串。 |
操作員
| 名稱 | Description |
|---|---|
| Equality(ValueTask<TResult>, ValueTask<TResult>) |
比較兩個平等的價值。 |
| Inequality(ValueTask<TResult>, ValueTask<TResult>) |
判斷兩個 ValueTask<TResult> 值是否不相等。 |