2013-11-18 3 views
2

Мы соединяемся с несколькими (около 15-20) сторонними веб-службами в нашем веб-приложении C#. Мы пытаемся найти лучший способ использования Multi-Threading или Async для одновременного вызова нескольких веб-сервисов (2-5).Несколько вызовов веб-сервисов сразу

Что было бы лучшим способом сделать это?

  • многопоточной
  • Асинхронный вызовы

Он должен уметь:

  • Подключение к Web Service A
  • Отправить запрос,
  • Подключение к Веб-служба B
  • Отправить запрос
  • Подключение к Web Service C
  • Отправить запрос
  • Etc ...

.. Все время ожидания ответа для WS A, B, C и т.д. ...

Я знаю, что мне нужно использовать IAyncResult, но я видел несколько примеров, а некоторые используют MultiThreading, а некоторые нет. Каким будет лучший способ?

+0

Привет, У вас есть код написанный? Кстати вы знаете параллельный код, это не асинхронно? – IamStalker

ответ

1

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

Во-первых, я настоятельно рекомендую вам прочитать эту документацию на MSDN: How to: Call WCF Service Operations Asynchronously

Во-первых, то, что вы будете делать это Генерирование WCF классы клиента прокси с SvcUtil.exe, но указав дополнительный флаг, /async (или просто /a), который будет генерировать сигнатуры метода Asynchronous Programming Model (APM). После того как вы получили эти прокси-серверы клиентов, вы можете просто вызвать их, как и любой другой метод APM, и предоставить обратный вызов, который будет вызываться после получения ответа.

Использование сигнатур WCF на основе APM сделает асинхронные исходящие и ожидающие сетевые операции ввода-вывода, которые освободят ваш «основной» поток, чтобы сделать 15-20 вызовов, которые необходимо выполнить одновременно. Кроме того, в то время как сетевые вызовы выдающиеся, ни один процессорный поток не будет потрачен впустую.

Теперь, если вы используете .NET 3.5, вам придется использовать какой-то примитив синхронизации для ожидания и сигнала после завершения каждого из обратных вызовов. К сожалению, нет CountdownEvent class в 3.5, но вы можете просто использовать Interlocked::Decrement, чтобы сделать обратный отсчет, а затем передать ManualResetEventSlim, когда он достигнет 0 (или найти стороннюю библиотеку, которая предоставляет это). Если вы используете .NET 4.0, вы можете вместо этого объединить модель APM с моделью Task-based Asynchronous Programming (TAP), используя TaskFactory::FromAsync и засуньте все Tasks в List<Task>, а затем используйте Task::WaitAll, чтобы дождаться их завершения до продолжения fwd. Наконец, если вы на .NET 4.5 вы могли бы сочетать это грациозно с ключевым словом C# async и Task::WhenAll вместо этого и сэкономить много ручной логики продолжения TPL.

+0

Он может создать «BackgroundTasks», и они позволят ему создавать параллельный асинхронный вызов сервисам. – IamStalker

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