WCF: обратный вызов не асинхронный - PullRequest
2 голосов
/ 05 июня 2009

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

Мой клиент подключается к серверу, вызывая метод входа в систему, где я сохраняю канал обратного вызова клиента, выполняя

MyCallback callback = 
      OperationContext.Current.GetCallbackChannel<MyNamespace.MyCallback>()

После этого сервер выполняет некоторую обработку и использует объект обратного вызова для связи с клиентом.

Все это работает, проблема заключается в том, что, хотя я установил метод в OperationContract как IsOneWay=true, сервер все еще зависает при выполнении вызова к клиенту.

Я проверил это, запустив сервер для отладки в Visual Studio, отсоединив его, запустив клиент, вызвав вышеупомянутый метод входа в систему, установив точку останова в реализованном методе обратного вызова клиента и сделав сервер отправить ответ клиенту. Сервер перестает делать то, что должен делать, ожидая ответа клиента.

Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 09 июля 2011

Хитрость заключается в том, чтобы вызывать обратный вызов асинхронно с сервера. Посмотрите на это:

    [OperationContract(IsOneWay = true, AsyncPattern = true)]
    IAsyncResult BeginOnMessageReceived(LiveDataMessage message, AsyncCallback acb, object state);
    void EndOnMessageReceived(IAsyncResult iar);
0 голосов
/ 12 марта 2010

Вы пытались установить

[CallbackBehavior(UseSynchronizationContext = false)]

на стороне клиента, реализующей интерфейс обратного вызова?

0 голосов
/ 05 июня 2009

Я думаю, что решение вашей проблемы - правильно установить атрибуты 'ConcurecyMode' и 'Instance ContextMode' для вашей службы. Для этого вы должны украсить декларацию сервиса этими атрибутами, как показано в следующем примере:

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
    public class SubscriberService: ISubscriberServiceContract
{...}

InstanceContextMode.Single создает вашу службу как объект Singleton, поэтому для всех клиентов работает только один экземпляр вашей службы;

ConcurencyMode.Reentrant или ConcurencyMode.Multiple включает многопоточную работу для экземпляра службы. Для «Несколько» вы должны позаботиться о синхронизации потоков в вашем сервисе.

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