Task.FromResult może zwrócić pojedynczyton
Task.FromResult<TResult>(TResult) teraz może zwracać wystąpienie buforowane Task<TResult> , a nie zawsze tworzyć nowe wystąpienie.
Stare zachowanie
W poprzednich wersjach zawsze przydzieli nowy Task<TResult>element , Task.FromResult<TResult>(TResult) niezależnie od typu T
lub wartości wyniku.
Nowe zachowanie
W przypadku niektórych T
typów i niektórych wartości Task.FromResult<TResult>(TResult) wyników może zwrócić buforowany obiekt pojedynczy, a nie przydzielać nowego obiektu. Na przykład prawdopodobnie każde wywołanie Task.FromResult(true)
metody zwróci ten sam obiekt, który został już ukończony Task<bool>
.
Wprowadzona wersja
.NET 6
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność binarną.
Przyczyna wprowadzenia zmiany
Wielu deweloperów oczekuje Task.FromResult<TResult>(TResult) się, że zachowuje się podobnie do metod asynchronicznych, które już wykonały takie buforowanie. Deweloperzy, którzy wiedzieli o zachowaniu alokacji, często utrzymywali własną pamięć podręczną, aby uniknąć kosztu wydajności zawsze przydzielania tych często używanych wartości. Na przykład:
private static readonly Task<bool> s_trueTask = Task.FromResult(true);
Teraz takie niestandardowe pamięci podręczne nie są już wymagane dla wartości, takich jak Boolean i małe Int32 wartości.
Zalecana akcja
Jeśli nie używasz równości odwołań w celu sprawdzenia, czy jedno Task
wystąpienie jest takie samo jak inne Task
wystąpienie, nie powinno to mieć wpływu na tę zmianę. Jeśli używasz takiej równości odwołań i musisz kontynuować to sprawdzanie, użyj następującego kodu, aby zawsze wrócić do unikatowego Task<TResult> wystąpienia:
private static Task<T> NewInstanceFromResult<T>(T result)
{
var tcs = new TaskCompletionSource<T>();
tcs.TrySetResult(result);
return tcs.Task;
}
Uwaga
Ten wzorzec jest znacznie mniej wydajny niż tylko przy użyciu Task.FromResult(result)
metody i należy go unikać, chyba że naprawdę tego potrzebujesz.
Dotyczy interfejsów API
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla