2010-07-19 3 views
0

У меня есть служба WCF, в которой я хочу использовать шаблон async, поскольку он в основном вызывает серию веб-сервисов, а затем обрабатывает результаты после того, как все вызовы веб-служб вернулись.WCF - Composite IAsyncResult

Однако асинхронный шаблон в WCF поддерживает только один IAsyncResult, возвращаемый в методе BeginXXX.

Мне было интересно, есть ли у кого-нибудь опыт создания сложного IAsyncResult, который мог бы сигнализировать, как только все веб-службы вернутся, или какие-либо другие идеи для решения проблемы?

ответ

0

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

Если да, то что бы я сделал, это создать пользовательский IAsyncResult, в то время как внутренне отслеживать каждый из IAsyncResults, связанных с каждым внутренним вызовом, а затем учитывать только мой пользовательский IAsyncResult (что подразумевает как сигнализацию, а также срабатывание любых обратных вызовов), когда выполняются все внутренние запросы.

+0

Спасибо за отзыв, вот что я думал делать, я надеялся, что будет ссылка, на которую кто-то мог бы указать мне. С точки зрения подхода, который мне нужен, тогда да, вы правы - это в основном вызов нескольких различных услуг параллельно (например, поиск автомобиля, просмотр почтового индекса) в разных местах. Когда вы говорите о бухгалтерском учете, значит ли это, что у вас есть опасения относительно подхода в целом? – spooner

+0

Нет проблем, он должен работать; просто вам нужно быть осторожным, чтобы его реализовать, так как его легко напортачить :). Что я имел в виду при ведении бухгалтерского учета, так это то, что вам нужно следить за состоянием каждого вызова и следить за тем, чтобы вы обрабатывали ошибки и т. Д. От каждого, что обычно означает, среди прочего, принятие решения о том, что вы хотите сделать, если один из N вызовов службы терпит неудачу (т. е. вы возвращаете ошибку или частичный ответ и т. д.). Реализация IAsyncResult на самом деле не слишком сложна, здесь есть образец: http://blogs.msdn.com/b/ploeh/archive/2007/02/09/agenericiasyncresultimplementation.aspx – tomasr

+0

А, ок. Я согласен, что это выглядит не так уж плохо, но, как вы говорите, легко повесить :) Как вы думаете, этот шаблон был бы уместным, если бы нам пришлось вызывать несколько длинных процедур в базе данных (например, по 2 секунды каждый)? Причина этого в том, что некоторые из наших устаревших функций имеют множество бизнес-логики в базе данных, поэтому для ее выполнения требуется некоторое время, и кажется, что тратить ресурсы веб-сервера для их синхронного запуска (может быть до 6 вызовов). Очевидно, что это добавляет сложности в код, но, похоже, было бы целесообразно улучшить масштабируемость веб-серверов. – spooner

Смежные вопросы