Подтвердить что ты не робот

Нужен образец огня и забыть асинхронный вызов службы WCF

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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