WCF duplex некорректно работает в потоке с GUI? - CodeHelper

WCF duplex некорректно работает в потоке с GUI?

3

Есть простенький сервис WCF, который по таймеру (700мс) отдает клиентам сообщение. Также клиент может сам полезть за сообщением на сервер.

Так вот, если клиент начнет обращаться за сообщениями к сервису с такой же частотой (700мс) из потока GUI, то он виснет и в результате получает TimeoutException, если же запускать клиента в консоле или в потоке, отдельном от GUI все работает

Где проблема?

Лучший ответ:

2

По умолчанию в WCF callbacks настроены так, чтобы вылеть в том же потоке, в котором создан сам callback-объект. Если callback-объект создается в потоке, связанном с GUI (например в форме WinForms), то он становится привязанным к этому потоку. Это создает ситуацию аналогичную deadlock`у: callback ждет когда закончит выполнение инициировавший его метод, а метод не может закончиться, потому что ждет когда выполнится callback. В итоге метод вызова сервиса прекращает работу с сообщением о таймауте. Исправляется это следующим образом:

Изменяем ConcurrencyMode в поведении сервиса на Reentrant:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
                 ConcurrencyMode=ConcurrencyMode.Reentrant)]
public class SampleService : ISampleService
{
    // ...
}

Устанавливаем значение свойства UseSynchronizationContext в false для поведения callback-объекта:

[CallbackBehavior(UseSynchronizationContext = false)]
class ServiceCallback : ISampleServiceCallback
{
    // ...
}
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.