Почему кэширование каналов WCF - это плохо? - PullRequest
11 голосов
/ 01 июня 2011

Я читал много статей о WCF онлайн, и кажется, что большинство людей кешируют объекты ChannelFactory, но не сами каналы.Похоже, что большинство людей боятся использовать кэширование каналов, потому что они не хотят обрабатывать сетевые сбои, которые могут сделать кэшированный канал непригодным для использования.Но это можно легко исправить, перехватив CommunicationException в методе, воссоздав канал и воспроизведя метод с помощью Reflection.

Тогда есть люди, которые думают, что кэширование каналов плохо, потому что все коммуникации будут проходить через один канал.См. Следующую статью.

http://social.msdn.microsoft.com/Forums/is/wcf/thread/9cbdf92a-a749-40ce-9ebe-3f2622cd78ee

Обязательно ли это плохо?Разве вы не можете делиться каналами между потоками?Будет ли производительность снижаться из-за того, что несколько вызовов методов, выполненных для этого одного канала, будут обрабатываться последовательно?

Я не нашел доказательств того, что совместное использование каналов приведет к снижению производительности.Я обнаружил, что использование кэшированного канала примерно в 5 раз быстрее, чем использование не кэшированного канала, даже если это означает необходимость использования Reflection для вызова методов на кэшированных каналах.

Другое преимуществоне нужно окружать все ваши вызовы WCF операторами try / catch / finally для вызова Close (), Abort () или Dispose () на канале, когда вы закончите с ним.Мне кажется, что WCF сделала шаг в неправильном направлении, заставив разработчиков управлять ресурсами канала WCF.В .NET Remoting вы создали прокси с помощью класса Activator, и вам не нужно было ничего с ним делать, чтобы его очистить..NET Framework все это обработал для вас.

1 Ответ

10 голосов
/ 01 июня 2011

2 основные причины:

  1. Создание ChannelFactory обходится дорого, и он безопасен для потоков => идеальный кандидат для кэширования.
  2. Канал, созданный фабрикой каналов, не дорог.создать, но это не потокобезопасно (ну, на самом деле это потокобезопасно, но параллельные вызовы будут блокироваться и выполняться последовательно) => не кэшировать его в многопоточной среде.

Вот хорошая статья , в которой более подробно.

...