繁体   English   中英

silverlight / wp7:HTTPwebrequest BeginGetResponse lambda表达式无法正常工作

[英]silverlight/wp7: HTTPwebrequest BeginGetResponse lambda expression not working correctly

我正在用lambda表达式的循环中调用HTTPwebrequest BeginGetResponse(此处,每次循环中索引都会递增)。

使用以下两种方法进行了尝试,但是,当调用OnHTMLFetchComplete时,我只会得到最终的索引值,而不是中间的索引值。

选项1:

  HttpWebRequest itemHtmlRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(itemDetail.Links));
  itemHtmlRequest.BeginGetResponse(result => OnHTMLFetchComplete(result, index, itemHtmlRequest),null);

选项2:

  HttpWebRequest itemHtmlRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(itemDetail.Links));

  itemHtmlRequest.BeginGetResponse(new AsyncCallback(
      result => OnHTMLFetchComplete(result, index, itemHtmlRequest)), null);

这是捕获循环变量的常见问题。 lambda表达式捕获index 变量 ,而不是其值。 不过,这是一个简单的解决方法:

for (int index = 0; index < ...; index++)
{
    int indexCopy = index;
    Uri uri = ...;
    HttpWebRequest itemHtmlRequest = WebRequest.CreateHttp(uri);
    itemHtmlRequest.BeginGetResponse(
        result => OnHTMLFetchComplete(result, indexCopy, itemHtmlRequest),null);
}

在这里,我们撷取indexCopy ,而不是index -但鉴于存在只是一个 index的变量,有一个新的indexCopy在每次循环迭代变量。 index的值随时间变化,而indexCopy的值不随时间变化,所以您可以。

埃里克·利珀特(Eric Lippert)在这方面有很多博客文章: 第1部分 第2部分

(注:也有它也有类似的答题负荷然而,所有的实际问题是不同的,我个人认为这是值得每一个回答不同的问题 ,以使希望更容易找到今后再发生类似的问题。)

在没有看到整个代码的情况下,我的猜测是在任何异步代码收到任何HTTP响应之前,外循环迭代已经完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM