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>AsTaskValueTask<TResult>實例只能等候一次,而且取用者在實例完成之前可能不會讀取 Result 。 如果無法接受這些限制,請呼叫 AsTaskValueTask<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> 時避免的配置。

因此,任何非同步方法的預設選擇應該是傳回 TaskTask<TResult> 。 只有在效能分析證明應該使用 而不是 時,才值得 ValueTask<TResult> 使用 Task<TResult> 。 在大部分情況下,不建議使用 的非泛型版本 ValueTaskCompletedTask當方法傳回同步且順利完成時,應該使用 屬性來傳回成功完成的單一 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> 值是否不相等。

適用於