I reported this bug on Microsoft Connect hace algún tiempo, pero ha sido cerrado como no solucionará
usted todavía tiene un problema en .NET 2.0 si se especifica su expiración absoluta en hora local.
Durante una hora al final del horario de verano, su hora local es un mbiguous, por lo que puede obtener resultados inesperados, es decir, la expiración absoluta puede ser una hora más de lo esperado.
En Europa, el horario de verano finalizaba a las 02:00 del 25 de octubre de 2009. El ejemplo siguiente ilustra que si colocaba un elemento en la memoria caché a las 01:59 con una caducidad de 2 minutos, permanecería en la memoria caché por una hora y dos minutos.
DateTime startTime = new DateTime(2009, 10, 25, 1, 59,0);
DateTime endTime = startTime.AddMinutes(2);
// end time is two minutes after start time
DateTime startUtcTime = startTime.ToUniversalTime();
DateTime endUtcTime = endTime.ToUniversalTime();
// end UTC time is one hour and two minutes after start UTC time
Console.WriteLine("Start UTC time = " + startUtcTime.ToString());
Console.WriteLine("End UTC time = " + endUtcTime.ToString());
La solución para .NET 2.0 o posterior es especificar el tiempo de expiración absoluta en UTC como señaló Ruben.
Microsoft tal vez debería recomendar el uso de UTC en los ejemplos de caducidad absoluta, pero creo que existe la posibilidad de confusión, ya que esta recomendación solo es válida para .NET 2.0 y posterior.
EDITAR
De los comentarios:
embargo, la exposición sólo se produce si la conversión sucede durante la superposición. La conversión simple que realmente toma el lugar es cuando aloja el artículo con Caché.Agregue
El problema solo ocurrirá si inserta un elemento en la memoria caché con un tiempo de expiración absoluta en hora local durante esa hora ambigua al final del horario de verano.
Así, por ejemplo, si su zona horaria local es Central Europeo (GMT + 1 en invierno, GMT + 2 en verano), y se ejecuta el código siguiente en 01:59:00 el 25 de octubre de 2009:
DateTime absoluteExpiration = DateTime.Now.AddMinutes(2);
Cache.Add(... absoluteExpiration ...)
luego el artículo permanecerá en la memoria caché durante una hora y dos minutos, en lugar de los dos minutos que normalmente esperaría. Esto puede ser un problema para algunas aplicaciones altamente críticas (por ejemplo, el ticker de valores, el tablero de salidas de aerolíneas).
lo que está sucediendo aquí es (suponiendo hora de Europa, pero el principio es el mismo para cualquier zona horaria):
DateTime.Now = 2009-10-25 01:59:00 local. local = GMT + 2, por lo que UTC = 2009-10-24 23:59:00
.AddMinutes (2) = 2009-10-25 02:01:00 local. local = GMT + 1, por lo que UTC = 2009-11-25 01:01:00
Cache.Add convierte internamente la hora de caducidad en UTC (2009-11-25 01:01:00) por lo que la caducidad es una hora y dos minutos antes de la hora UTC actual (23:59:00).
Si utiliza DateTime.UtcNow en lugar de DateTime.Now, la caducidad de la caché será de dos minutos (.NET 2.0 o posterior):
DateTime absoluteExpiration = DateTime.UtcNow.AddMinutes(2);
Cache.Add(... absoluteExpiration ...)
De los comentarios:
¿O me falta algo?
No, no lo eres. Su análisis es perfecto y si su aplicación es de tiempo crítico y se ejecuta durante ese período al final del horario de verano, está en lo correcto al utilizar DateTime.UtcNow.
La declaración en la respuesta de Ruben que:
usted es seguro de usar, ya sea mientras la Clase en el momento en que la oferta es establecer
es incorrecto.
@Joe: estoy de acuerdo en que el caso que ha presentado arriba es correcto. Pero la exposición solo ocurre si la conversión ocurre durante la superposición. La única conversión que realmente tiene lugar es cuando aloja el elemento con Cache.Add. No estoy seguro de qué puntos le atribuye a Jeff sobre la mejor política: especificar un vencimiento basado en Utc o cómo los documentos deberían cubrirlo. ¿No es ese el punto que hice en mi respuesta [a mí mismo]? ¿O me estoy perdiendo algo? (Entiendo el problema de raíz, por lo que mencioné la pregunta en primer lugar) –
@Joe: +1 re el enlace al elemento Conectar: acepto que es un error de doc –
@Joe - has atribuido incorrectamente algunas cosas a mi respuesta, así que he editado su respuesta para arreglarlas (aparte de eso, buen descubrimiento). –