Task.FromResult puede devolver singleton

Task.FromResult<TResult>(TResult) ahora puede devolver una instancia de Task<TResult> almacenada en caché en lugar de crear siempre una.

Comportamiento anterior

En versiones anteriores, Task.FromResult<TResult>(TResult) siempre asignaba una nueva instancia de Task<TResult>, independientemente del tipo de T o del valor del resultado.

Comportamiento nuevo

Para algunos tipos de T y ciertos valores de resultado, Task.FromResult<TResult>(TResult) puede devolver un objeto singleton almacenado en caché en lugar de asignar un nuevo objeto. Por ejemplo, es probable que cada llamada a Task.FromResult(true) devuelva el mismo objeto Task<bool> ya completado.

Versión introducida

.NET 6

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria.

Motivo del cambio

Muchos desarrolladores esperaban que Task.FromResult<TResult>(TResult) se comportara de forma similar a los métodos asincrónicos, que ya realizaban este tipo de almacenamiento en caché. Los desarrolladores que conocían el comportamiento de asignación solían mantener su propia memoria caché para evitar el costo de rendimiento que implicaba realizar siempre una asignación para estos valores de uso frecuente. Por ejemplo:

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

Ahora, estas memorias caché personalizadas ya no son necesarias para valores como Boolean y valores Int32 pequeños.

A menos que use la igualdad de referencia para comprobar si una instancia de Task es igual que otra instancia de Task, este cambio no debería afectarle. Si usa esta igualdad de referencia y necesita continuar con esta comprobación, use el código siguiente para garantizar que siempre se obtenga una instancia de Task<TResult> única:

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

Nota:

Este patrón es mucho menos eficaz que usar simplemente Task.FromResult(result) y debe evitarse, a menos que lo necesite realmente.

API afectadas