WCF "Fire and Forget" не позволяет продолжить выполнение хоста, как ожидалось

У меня есть служба 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 ответа

Решение

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

Есть 2 способа, которыми я смог воспользоваться, чтобы обойти эту проблему:

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

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

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

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

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

Другие вопросы по тегам