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.
Acción recomendada
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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de