ValueTask<TResult> 結構

定義

提供包裝 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

結果。

繼承
ValueTask<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 TaskTask<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> 值是否不相等。

適用於