Моя служба WCF использует netTcpBinding и имеет объект обратного вызова.
Мне нужно обслуживать несколько одновременных клиентов и обслуживать сессии, поэтому служба украшена
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple]
Чтобы избежать взаимоблокировок потоков, класс обратного вызова украшен
[CallbackBehavior(UseSynchronizationContext=false)]
и я использую SynchronizationContext
для выполнения метода в потоке пользовательского интерфейса.
Проблема в том, что иногда жест канала закрывается без причины (событие ICommunicationObject.Closing
запускается). После этого я получаю исключения при любом последующем обращении в службу поддержки.
Глядя в файл трассировки, последнее сообщение является обратным вызовом, однако метод обратного вызова никогда не вызывается. Исключений нет.
После некоторой отладки я обнаружил, что это происходит только тогда, когда выполняется обратный вызов в середине синхронной операции. Шаги будут такими:
- Вызов метода обслуживания
A
с IsOneWay=true
- Вызов метода обслуживания
B
с IsOneWay=false
A
вызывает метод обратного вызова, но B
все еще выполняется.
Это не должно быть проблемой, потому что обратный вызов имеет UseSynchronizationContext=false
, поэтому вызов обратного вызова может присутствовать в отдельном потоке.
Мне не удалось воспроизвести проблему в более простом сценарии. Выполнение этих шагов в простом проекте выполняется успешно.
Есть идеи, что может происходить или как определить проблему?