Ваша проблема с одним ответом, скорее всего, вызвана тем, что вы используете анонимные методы и то, как работает область видимости, когда вы помещаете их в циклы.Вы отбрасываете более ранние ссылки на запросы на каждом шаге цикла.
См. Мой пост на эту тему здесь http://csainty.blogspot.com/2010/10/windows-phone-7asynchronous-programming.html
Самый простой способ проиллюстрировать это - переписать ваш код с полнымметоды, это заставляет вас рассматривать область действия, а не просто слепо ссылаться на внешние переменные в ваших делегатах.
foreach (var current in Addresses)
{
var request = HttpWebRequest.Create(current);
request.BeginGetResponse(EndGetResponse, new RequestState { Request = request, Address = current });
}
private void EndGetResponse(IAsyncResult result) {
try {
var state = (RequestState)result.AsyncState;
var response = (HttpWebResponse)state.Request.EndGetResponse(result);
Deployment.Current.Dispatcher.BeginInvoke(GotResponse, state.Address, response.StatusCode);
} catch (Exception) {
Debug.WriteLine("Error in EndGetResponse");
}
}
private void GotResponse(Address address, HttpStatusCode code) {
//BOOM RECEIVED
}
public class RequestState {
HttpWebRequest Request { get; set; }
Address Address { get; set; }
}
Как только вы решите проблемы с областями видимости, вы можете переписать их обратно в анонимные методы по стилистическим причинам, если хотите.1009 *
Это только решит вашу первую проблему получения всех ответов, однако, я предполагаю, что вам также нужно запустить некоторый код, когда все запросы завершены, чтобы проверить состояние всего пакета?
То естьсовсем другая проблема.
Вы не можете использовать WaitOne () или что-то в этом роде, это заблокирует ваш поток и остановит запросы на выполнение вообще.Возможно, вы захотите вызвать другой метод в вашем коде BOOM, который хранит результаты и проверяет, все ли результаты уже есть.