По умолчанию в 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
{
// ...
}