Udostępnij za pośrednictwem


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.

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