Нужен пример пожара и забыть асинхронный вызов службы WCF - PullRequest
12 голосов
/ 22 апреля 2009

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

Что я думаю, что мне нужно, и я прочитал об этом здесь на stackoverflow, что необходимо .., (по существу) подготовить или изменить код ваших служб WCF, чтобы иметь возможность обрабатывать асинхронный вызов к ним. Если так, то как бы выглядел простой пример этого? (Может быть, пример до и после). Также необходимо ли это в .Net 3.5?

Во-вторых, я использую прокси-сервер из службы WCF, выполняющий вызов следующей службы WCF, и мне нужен пример асинхронного вызова службы WCF, если он выглядит не так, как в BeginEnvoke и EndEnvoke с типичными асинхронными примерами .

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

Ответы [ 3 ]

22 голосов
/ 22 апреля 2009

Установите для свойства IsOneWay атрибута OperationContract значение true для метода WCF, к которому вы обращаетесь. Это говорит WCF, что вызов имеет значение только для одного направления, и клиент не будет зависать для завершения метода.

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

[ServiceContract]
interface IWCFContract
{
   [OperationContract(IsOneWay = true)]
   void CallMe()
}

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

7 голосов
/ 22 апреля 2009

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

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

И обязательно применяйте механизм обеспечения безопасности потоков, чтобы избежать конфликтов между двумя потоками, работающими в этой очереди.

0 голосов
/ 02 сентября 2015

Не используйте BeginInvoke или даже поток для вашего шаблона. Убедитесь, что вы украсили свои классы с помощью AsyncPattern в соответствии с веб-сайтом Microsoft, иначе ваши делегаты и потоки Async будут работать в синхронном режиме. WCF заставляет это поведение. Эта информация была опубликована другим опером, который нашел решение для блокировки вопроса обратного вызова в стеке ... извините, но я не помню ссылку.

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