WebRequest и WebService вызывают асинхронно в C # - PullRequest
1 голос
/ 21 сентября 2010

У меня есть приложение MVC (также относится не к MVC), где пользователь публикует данные. Мне нужно взять эти данные, отправить их в две отдельные конечные точки (одну с помощью формы POST веб-запроса и одну с помощью веб-службы), проанализировать результат и отправить результат обратно первоначальному пользователю.

Проблема в том, что обеим конечным точкам требуется около 20-30 секунд для ответа (ответ - строка), что означает, что мне, вероятно, следует выполнить эти два вызова асинхронно. В то же время я хочу дождаться ответа первоначального пользователя, пока не получу оба результата обратно. Я предполагаю, что мне, возможно, придется использовать какую-то блокировку объекта, чтобы ответ не возвращался до завершения двух вызовов?

Я на правильном пути? У кого-нибудь есть информация о том, как этого добиться? Любая помощь приветствуется.

Спасибо

EDIT

Основываясь на ответах, я решил использовать асинхронные контроллеры, поскольку я уже работаю с приложением MVC. Спасибо за ваш вклад.

Ответы [ 2 ]

1 голос
/ 21 сентября 2010

Вы можете вызвать Join для двух асинхронных потоков, чтобы дождаться их возврата.Вы также захотите изучить асинхронные контроллеры.Это доступно в MVC2, но вы также можете взглянуть на функции MVC1, которые, я считаю, реализуют асинхронные действия.Вы захотите сделать это, чтобы не блокировать IIS для обработки большего количества потоков.

0 голосов
/ 21 сентября 2010

Я думаю, вы найдете это полезным: Rx: Соединение нескольких IObservable веб-запросов

В частности, использование ForkJoin для ожидания возвращения обоих ответов, как указано в комментариях:

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

Используйте Observable.ForkJoin для одновременного выполнения нескольких асинхронных вызовов, а затем объедините все результаты в один IObservable.Затем используйте SelectMany (другой оператор from), как описано выше, чтобы подписаться на другую наблюдаемую информацию на основе объединенного результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...