Сначала получите себе копию Программирование служб WCF , если у вас ее еще нет.
Если клиент WinForm или WPF, вам нужно использовать [CallbackBehavior(UseSynchronizationContext = false)]
какв противном случае клиент не будет обрабатывать входящее сообщение, пока поток пользовательского интерфейса не войдет в цикл обработки сообщений.
Во-первых, «дуплексный» канал в WCF не является действительно дуплексным! Сообщение от
- Клиент-сервер
- Может заблокировать сообщение, которое сервер ожидает от клиента
- (или наоборот)
Поскольку сообщения отправляются только по порядку на одном канале WCF.Дуплексный канал WCF НЕ дает вам две очереди входящих сообщений.Результаты, возвращаемые вызовом «TwoWay», точно такие же, как и «вызов» с этим уровнем стека WCF. Как только вы обдумаете это, многие проблемы станут понятнее.
Если клиент WinForm или WPF, вам может потребоваться использовать [CallbackBehavior(UseSynchronizationContext = false)]
, иначе клиент не будет обрабатывать входящее сообщение, пока поток пользовательского интерфейса не войдет в цикл обработки сообщений.
Некоторые правила, которые я нашел, чтобы помочьизбегать тупиков.(Посмотрите на мои вопросы WCF, чтобы увидеть, какую боль я испытывал!)
Сервер никогда не должен вызывать клиента по тому же соединению, когда выполняется вызов от того же клиента.
И / или
Клиент никогда не должен перезванивать на сервер по тому же соединению, которое используется для «обратных вызовов» при обработке обратного вызова.
В следующий раз, я думаю, я просто буду использовать два контракта (и, следовательно, TCP-соединения), один для обратного вызова, а другой для всех запросов клиент-сервер.Или используйте мою собственную систему опроса, так как это доставило мне столько боли.
Извините, у меня сегодня нет времени, чтобы написать пример.В любом случае, большинство примеров работают для того, что пример пытается сделать, но по какой-то причине ломаются в реальной жизни с вашим приложением.
Лучший веб-сайт, который я знаю для примеров WCF, - это Сеть Ювала Лоуиsite .
Вам также могут пригодиться вопросы, которые я задавал о WCF по переполнению стека , поскольку у меня были такие же проблемы, как и у вас.
Кроме того, проведя день или два, читая все вопросы и ответы WCF по переполнению стека, вы получите представление о проблемах, которых следует избегать.