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

时间:2011-01-13 07:47:45

标签: c# silverlight windows-phone-7

我在一个带有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);

2 个答案:

答案 0 :(得分:4)

这是捕获循环变量的常见问题。 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有一篇很棒的博客文章:part 1; part 2

(注意:有加载的问题有类似的答案。但是,所有实际的问题都不同。我个人认为值得回答每个不同的问题,希望将来更容易找到类似的问题。)

答案 1 :(得分:0)

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