В документации для LazyThreadSafetyMode указано, что использование значения ExecutionAndPublication может вызвать взаимоблокировки, если метод инициализации (или конструктор по умолчанию, если есть нет метода инициализации) использует внутренние блокировки. Я пытаюсь лучше понять примеры, которые могут вызвать тупик при использовании этого значения. При использовании этого значения я инициализирую ChannelFactory. Я не вижу конструктора ChannelFactory, использующего любые внутренние блокировки (просматривая класс с Reflector), поэтому я считаю, что этот сценарий не соответствует возможной ситуации взаимоблокировки, но мне любопытно, какие ситуации могут вызвать тупик, а также если возможно тупик, инициализирующий ChannelFactory.
Итак, вкратце, мои вопросы:
-
Можно ли вызвать тупик, инициализирующий ChannelFactory с помощью ExecutionAndPublication?
-
Каковы возможные способы заставить тупик инициализировать другие объекты с помощью ExecutionAndPublication?
Предположим, что у вас есть следующий код:
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();
}
}