La documentación para LazyThreadSafetyMode estados que el uso de la ExecutionAndPublication valor podría causar bloqueos si el método de inicialización (o el constructor por defecto, si no hay un método de inicialización) utiliza bloqueos internos. Estoy tratando de comprender mejor los ejemplos que podrían causar un punto muerto al usar este valor. En mi uso de este valor, estoy inicializando un ChannelFactory. No puedo ver el constructor de ChannelFactory usando bloqueos internos (revisando la clase con Reflector), así que creo que este escenario no se ajusta a la posible situación de interbloqueo, pero tengo curiosidad por saber qué situaciones podrían causar un punto muerto y si podría haber un posible deadlock inicializando ChannelFactory.Lazy <T> ExecutionAndPublication - ejemplos que podrían causar interbloqueo
tanto, para resumir, mis preguntas son:
¿Es posible hacer que un punto muerto inicializar el ChannelFactory usando ExecutionAndPublication?
¿Cuáles son algunas formas posibles de causar un interbloqueo inicializando otros objetos utilizando ExecutionAndPublication?
Supongamos que tenemos el siguiente código:
class x
{
static Lazy<ChannelFactory<ISomeChannel>> lcf =
new Lazy<ChannelFactory<ISomeChannel>>(
() => new ChannelFactory<ISomeChannel>("someEndPointConfig"),
LazyThreadSafetyMode.ExecutionAndPublication
);
public static ISomeChannel Create()
{
return lcf.Value.CreateChannel();
}
}
Excelente respuesta @svick - ejemplo clásico de bloqueos anidados adquiridos en el orden opuesto, esto está en la línea de lo que estaba pensando - gran ejemplo para aclarar el escenario, ¡gracias! – dugas