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
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應