Dokumentacja dla LazyThreadSafetyMode stwierdza, że użycie wartości ExecutionAndPublication może spowodować zakleszczenia, jeśli metoda inicjowania (lub domyślny konstruktor, jeśli nie ma metody inicjowania) używa wewnętrznych blokad. Próbuję lepiej zrozumieć przykłady, które mogą spowodować zakleszczenie podczas korzystania z tej wartości. Przy używaniu tej wartości inicjuję ChannelFactory. Nie widzę konstruktora ChannelFactory za pomocą jakichkolwiek wewnętrznych blokad (przeglądanie klasy z Reflectorem), więc uważam, że ten scenariusz nie pasuje do możliwej sytuacji zakleszczenia, ale jestem ciekawy, jakie sytuacje mogą spowodować zakleszczenie, a także czy może być możliwe impas inicjalizujący ChannelFactory.Lazy <T> ExecutionAndPublication - Przykłady, które mogą spowodować zamknięcie na klucz
Tak więc, aby podsumować moje pytania to:
Czy to możliwe, aby doprowadzić do impasu Inicjowanie ChannelFactory korzystając ExecutionAndPublication?
Jakie są możliwe sposoby spowodowania impasu inicjowania innych obiektów przy użyciu ExecutionAndPublication?
Załóżmy, że mamy następujący kod:
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();
}
}
Świetna odpowiedź @svick - klasyczny przykład zagnieżdżonych zamków nabytych w odwrotnej kolejności, jest to zgodne z tym, o czym myślałem - świetnym przykładem do wyjaśnienia scenariusza, dziękuję! – dugas