Вы не упомянули об этом в своем вопросе, но вы отметили вопрос тегом 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.
Привет, У вас есть код написанный? Кстати вы знаете параллельный код, это не асинхронно? – IamStalker