Нужен образец огня и забыть асинхронный вызов службы WCF
В запланированный интервал мне нужно вызвать вызов службы WCF другой службы WCF несинхронно. Планирование вызова службы WCF я разработал.
Я думаю, что мне нужно, и я прочитал здесь о stackoverflow, что необходимо... (по сути) подготовить или изменить код ваших служб WCF, чтобы иметь возможность обрабатывать асинхронный вызов. Если да, то на что может выглядеть простой пример (возможно, до и после примера) И все же это необходимо в .Net 3.5?
Во-вторых, я использую прокси из службы WCF, выполняющего вызов следующей службы WCF, и вам нужен образец асинхронного вызова службы WCF, если он выглядит иначе, чем то, что характерно для BeginEnvoke и EndEnvoke, с типичными примерами async.
Я бы поверила, если я полностью уйду от моего вопроса и буду признательна за любую коррекцию, чтобы установить лучший вопрос.
Ответы
Ответ 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 заставляет это поведение. Эта информация была отправлена другим оператором, который нашел решение для блокировки вопроса обратных вызовов в стеке. Извините, но я не помню ссылку.