Windows phone 7 在WP7中执行多个webrequests?
我有一个使用httpWebRequest访问的地址列表。 我只需要服务器返回的状态码 我试图通过它们进行foreach,并对它们中的每一个启动一个httpWebRequest,但是我只收到最后一个的回调。 似乎一次只允许一个webrequest 我很难理解在没有GetResponse的情况下如何实现这一点,这在silverlight中是不允许的 代码正在backgroundworker中运行。 我正在使用Mango-WP7.1 我该如何解决这个问题Windows phone 7 在WP7中执行多个webrequests?,windows-phone-7,httpwebrequest,backgroundworker,Windows Phone 7,Httpwebrequest,Backgroundworker,我有一个使用httpWebRequest访问的地址列表。 我只需要服务器返回的状态码 我试图通过它们进行foreach,并对它们中的每一个启动一个httpWebRequest,但是我只收到最后一个的回调。 似乎一次只允许一个webrequest 我很难理解在没有GetResponse的情况下如何实现这一点,这在silverlight中是不允许的 代码正在backgroundworker中运行。 我正在使用Mango-WP7.1 我该如何解决这个问题 foreach (var current in
foreach (var current in Addresses)
{
var request = HttpWebRequest.Create(current);
request.BeginGetResponse(r =>
{
try
{
var response = (HttpWebResponse)request.EndGetResponse(r);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
//BOOM RECEIVED
});
}
catch (Exception)
{
Debug.WriteLine("Error in EndGetResponse");
}
}, null);
}
提前感谢=)单个响应的问题很可能是由于您使用匿名方法以及将这些方法放入循环中时作用域的工作方式造成的。在循环的每一步中,您都会丢弃前面的请求引用 在这里查看我关于这个主题的博客帖子
最简单的方法是用完整的方法重写代码,这迫使您考虑范围,而不是盲目地引用委托中的外部变量。
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; }
}
一旦你解决了范围问题,如果你愿意的话,你可以出于风格的原因重写回anonymos方法
这只会解决您获取所有响应的第一个问题,但是,我假设您还需要在所有请求完成后运行一些代码来检查整个批处理的状态?这是一个完全不同的问题
您不能使用WaitOne()或类似的东西,它将锁定您的线程并停止请求的实际运行。您可能希望取消BOOM代码中的另一种方法,该方法存储结果并检查是否所有结果都已输入。是的,我使用的是mango=)您收到的是什么样的“BOOM”?我收到状态代码,然后更新模型。繁荣只是为了说明收到了一些东西=)我想知道你是否可以在Caliburn微协同路由中这样迭代,每个请求都会产生返回,处理返回,继续进行。我知道使用完整方法而不是匿名方法将如何解决问题。但是,如果问题本身就是使用匿名方法,那么我以后如何将其重写为匿名方法呢?我很好奇,因为采用匿名方式可以更容易地引用循环中的对象。在我的项目中,地址位于一个对象上,我正在迭代的集合实际上是这些对象的列表。当收到请求响应时,我需要启动请求的对象来保存一些返回值。@这就是问题所在,你不能只引用匿名方法之外的对象,我的博客文章解释了当你这样做时会发生什么。我更新了答案,以显示如何将多个状态传递给响应。