Создать новую ChannelFactory <T>при ошибке - PullRequest
1 голос
/ 03 июня 2011

Каков был бы самый надежный способ воссоздания ChannelFactory потокобезопасным способом, когда он входит в неисправное состояние?Этот сценарий предполагает параллелизм (скажем, 50 одновременных клиентов ради аргумента).Я хотел бы знать некоторые рекомендуемые подходы / мысли / мнения для достижения этой цели (или альтернативы).

Редактировать:

Используя ответ @Ladislav Mrnka - кажется, самый надежный способ сделать это - создать оболочку для ChannelFactory .Я закончил тем, что сделал это, и показал метод CreateChannel обертки.

Ответы [ 2 ]

4 голосов
/ 03 июня 2011

Как вы думаете, это решение поможет вам?Вы заблокируете секцию так, чтобы только один поток мог войти в эту секцию и проверить, является ли ChannelFactory ошибочным, и воссоздать его, но экземпляр для фабрики каналов является общим - вы возвращаете его из свойства так:

  • Если вы сделаете проверку и создадите экземпляр, другой поток сможет после этого получить фабрику и вызвать ошибку перед тем, как использовать новую фабрику в исходном потоке (состояние гонки).
  • Если вы воссоздаете неисправную фабрикувсе остальные потоки, которые уже содержат ссылку, все еще указывают на ошибочную.

Таким образом, решение гарантирует, что ChannelFactory будет воссоздано в поточно-безопасном режиме, но вам все равно придется проверить, еслиФабрика неисправна везде, где вы хотели бы ее использовать (которая должна быть поточно-безопасной, чтобы быть надежной).

Я полагаю, что надежный подход заключается в создании обертки вокруг ChannelFactory и обработке всей сложности с безопасностью потоков и проверкой ошибокФабрика внутри обертки.Оболочка предоставит метод CreateChannel и все другие необходимые вам методы.Вы можете использовать такую ​​оболочку для управления несколькими фабриками.

...