Являются ли звонки синхронными в WCF? - PullRequest
1 голос
/ 25 февраля 2009

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

Подписчики подписываются на сервер, используя DuplexPipeChannel, вызывая метод Subscribe () на сервере.

Сервер поддерживает список <> подписчиков, а когда есть данные, которые нужно отправить подписчикам, он вызывает метод PushData ().

Мое намерение состоит в том, чтобы перебрать список подписчиков, вызывающих метод push для каждого из них по очереди.

Что я хочу знать: вызывает ли метод push на моем подписчике блокировку? Будет ли сбой подключения или задержка соединения с одним из абонентов причиной задержки остальных push-вызовов (или, что еще хуже, сбоя)?

Извините, если это очевидный вопрос, но я до сих пор был человеком .Net 2.0, поэтому я очень мало знаю о WCF.

Мой код WCF слишком слабо основан на этом руководстве .

Другой вопрос Предполагая, что это синхронно, мне лучше порождать новый поток для обработки запросов на стороне клиента или мне лучше порождать новый поток для каждого "push serveride?"

Ответы [ 2 ]

4 голосов
/ 25 февраля 2009

Вызовы WCF по умолчанию являются синхронными, хотя их можно настроить как асинхронные. Смотрите ответ Джарретта ниже. Взгляните здесь . Каждое отправленное вами сообщение будет возвращать результат независимо от того, ожидаете вы данных или нет.

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

Надеюсь, это поможет.

Редактировать: Относительно порождения потоков на стороне клиента против стороны сервера. Серверный. Если вызов клиента занимает некоторое время, то есть время, но если это занимает много времени, поскольку сервер фактически отправляет вызовы другим клиентам в ходе того же вызова, то что-то не так. Я бы на самом деле не создавал новую ветку каждый раз. Просто создайте шаблон производитель / потребитель на стороне сервера, чтобы каждый раз, когда элемент данных помещался в очередь, потребитель брал его. Черт, вы даже можете иметь несколько потребителей.

3 голосов
/ 25 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...