WCF "Fire and Forget" не позволяет продолжить выполнение хоста, как ожидалось - PullRequest
0 голосов
/ 11 мая 2011

У меня есть служба Windows, на которой размещается одноэлементная служба WCF, которая кэширует большое количество данных. При запуске службы Windows я делаю следующее:

// start client service
        wcfService= new ServiceHost(typeof(MyWcfService));
        wcfService.Open();

        using (HostedServiceReference.WcfServiceProxy wcfServiceProxy = new HostedServiceReference.WcfClientServiceProxy())
        {
            wcfServiceProxy.RefreshDisplayCacheFromSource();
            // 1st echo to console
            Console.WriteLine("Display Cache Refreshed"));
        }
        // 2nd echo to console
        Console.WriteLine("Begin other processing"))

и у меня есть метод, настроенный в контракте на обслуживание следующим образом:

[OperationContract(IsOneWay=true)]
    void RefreshDisplayCacheFromSource();

Я ожидал сразу увидеть 1-й и 2-й эхо, отображаемые в консоли, но на самом деле я вижу только 1-й эхо. 2-я строка не отображается, пока мой метод «забей и забудь» не завершил свою долгую операцию.

Может кто-нибудь объяснить, что происходит в фоновом режиме?

Мои теории на данный момент:

Блокирует ли служба wcf в одноэлементном режиме службу, в которой она размещается?

Это как-то связано с оператором using?

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Прокси-объект для службы WCF будет удален в конце блока using, но это не может произойти, пока клиент не получит подтверждение, что служба получила свое сообщение.Похоже, что служба не отправляет подтверждение до тех пор, пока не выполнит весь код в теле метода (включая обработку большого объема данных), поэтому выполнение на клиенте ожидает в конце блока using, пока служба не завершит свою работу.обработка.

Есть два способа обойти эту проблему:

Сделать прокси-объект глобальной переменной в клиенте.

Раскрутить потокв сервере для обработки длительной обработки, позволяя методу сервера немедленно вернуться с подтверждением, которого ждет клиент.

0 голосов
/ 23 мая 2011

Если ваша цель состоит в том, чтобы просто иметь возможность продолжать выполнять другую работу, пока вызов WCF делает свое дело, щелкните правой кнопкой мыши ссылку на службу и нажмите «Обновить ссылку службы». Установите флажок для генерации асинхронных методов.

Затем вызовите его как wcfServiceProxy.RefreshDisplayCacheFromSourceAsync ();

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

...