在WP7中执行多个webrequests?

时间:2011-07-15 12:27:46

标签: windows-phone-7 httpwebrequest backgroundworker

我有一个我想使用httpWebRequest访问的地址列表。 我只需要服务器返回的状态码。

我试图通过它们进行操作并在每个上面开始一个httpWebRequest,但后来我只收到了最后一个回调。 似乎一次只允许一个webrequest。

我很难理解如何在没有GetResponse的情况下做到这一点,这在Silverlight中是不允许的。

代码在后台工作程序中运行。 我正在使用芒果 - WP7.1

我该如何解决?

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);
        }

提前致谢=)

1 个答案:

答案 0 :(得分:1)

单个响应的问题很可能是由于您使用匿名方法以及将这些内部循环放入作用域时的方式。您将在循环中的每个步骤中丢弃先前的请求引用。

请参阅我的博客主题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; }
}

一旦解决了范围问题,您可以根据风格原因重写为anonymos方法。

这只会解决您收到所有回复的第一个问题,但是我假设您还需要在完成所有请求后运行一些代码来检查整批的状态?
这完全是一个不同的问题。

你不能使用WaitOne()或类似的东西,它会锁定你的线程并停止实际运行的请求。您可能希望调用BOOM代码中的另一个方法来存储结果并检查是否所有结果都已存在。