Task.FromResult 可能傳回單一資料庫

Task.FromResult<TResult>(TResult) 現在可能傳回經過快取的 Task<TResult> 執行個體,而非一律建立新的執行個體。

舊的行為

在先前的版本中,Task.FromResult<TResult>(TResult) 會一律配置新的 Task<TResult>,無論 T 的型別或結果值為何。

新的行為

針對某些 T 型別和部分結果值,Task.FromResult<TResult>(TResult) 可能傳回經過快取的單一資料庫物件,而非配置新物件。 例如,每次針對 Task.FromResult(true) 的呼叫很可能都會傳回相同的已完成 Task<bool> 物件。

導入的版本

.NET 6

中斷性變更的類型

這項變更會影響二進位相容性

變更原因

許多開發人員期望 Task.FromResult<TResult>(TResult) 能與非同步方法有類似的行為,後者已經執行這類快取動作。 已知有配置行為的開發人員常會維持自己的快取,以免除一律為這些常用的值進行配置的效能成本。 例如:

private static readonly Task<bool> s_trueTask = Task.FromResult(true);

現在不需要再為 Boolean 之類的值和小型 Int32 值自訂這類快取。

除非您使用參考相等來檢查一個 Task 執行個體是否與另一個 Task 相同,否則應不會受這項變更所影響。 如果您使用類似參考相等且須繼續進行檢查,請用以下程式碼保證自己一律獲得唯一的 Task<TResult> 執行個體:

private static Task<T> NewInstanceFromResult<T>(T result)
{
    var tcs = new TaskCompletionSource<T>();
    tcs.TrySetResult(result);
    return tcs.Task;
}

注意

此模式的效率比單純使用 Task.FromResult(result) 低落不少,除非真有需要,否則應盡量避免。

受影響的 API