System.Lazy <T> con diferente modo de seguridad de hilo

.NET 4.0System.Lazy <T> La clase ofrece tres modos de seguridad de subprocesos a través de la enumeraciónLazyThreadSafetyMode, que resumiré como:

LazyThreadSafetyMode.None - No es seguro para hilos.LazyThreadSafetyMode.ExecutionAndPublication - Solo un hilo concurrente intentará crear el valor subyacente. En la creación exitosa, todos los hilos en espera recibirán el mismo valor. Si se produce una excepción no controlada durante la creación, se volverá a generar en cada subproceso en espera, se almacenará en caché y se volverá a generar en cada intento posterior de acceder al valor subyacente.LazyThreadSafetyMode.PublicationOnly - Múltiples hilos concurrentes intentarán crear el valor subyacente, pero el primero en tener éxito determinará el valor pasado a todos los hilos. Si se produce una excepción no controlada durante la creación, no se almacenará en caché y los intentos simultáneos y posteriores de acceder al valor subyacente volverán a intentar la creación y pueden tener éxito.

Me gustaría tener un valor de inicialización diferida que siga reglas de seguridad de subprocesos ligeramente diferentes, a saber:

Solo un hilo concurrente intentará crear el valor subyacente. En la creación exitosa, todos los hilos en espera recibirán el mismo valor. Si se produce una excepción no controlada durante la creación, se volverá a generar en cada subproceso en espera, pero no se almacenará en caché y los intentos posteriores de acceder al valor subyacente volverán a intentar la creación y pueden tener éxito.

Entonces, la clave es la diferencia conLazyThreadSafetyMode.ExecutionAndPublication es que si falla un "primer intento" en la creación, se puede volver a intentar más adelante.

¿Existe una clase existente (.NET 4.0) que ofrezca estas semánticas, o tendré que pasar la mía? Si paso el mío, ¿hay alguna forma inteligente de reutilizar el Lazy <T> existente dentro de la implementación para evitar el bloqueo / sincronización explícito?

nótese bien Para un caso de uso, imagine que la "creación" es potencialmente costosa y propensa a errores intermitentes, que implican, p. obtener una gran cantidad de datos de un servidor remoto. No me gustaría hacer múltiples intentos simultáneos para obtener los datos, ya que probablemente todos fallarán o todos tendrán éxito. Sin embargo, si fallan, me gustaría poder volver a intentarlo más adelante.

Respuestas a la pregunta(5)

Su respuesta a la pregunta