silverlight / wp7: HTTPwebrequest BeginGetResponse лямбда-выражение работает неправильно - PullRequest
0 голосов
/ 13 января 2011

Я вызываю HTTPwebrequest BeginGetResponse в цикле с лямбда-выражением (здесь индекс увеличивается каждый раз в цикле).

Пробовал с использованием обоих приведенных ниже подходов, однако, когда вызывается OnHTMLFetchComplete, я получаю только окончательное значение индекса, а не промежуточные.

option1:

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

Option2:

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

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

Ответы [ 2 ]

4 голосов
/ 13 января 2011

Это общая проблема захвата переменной цикла.Лямбда-выражение фиксирует переменную 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 - нет, так что все в порядке.

У Эрика Липперта есть отличная пара постов в блоге на эту тему: part 1; часть 2 .

(Примечание: есть грузы вопросов, на которые есть аналогичный ответ. Однако все фактические вопросы различны.Я лично думаю, что стоит ответить на каждый отдельный вопрос , чтобы, надеюсь, упростить поиск похожих вопросов в будущем.)

0 голосов
/ 13 января 2011

Не видя весь код, я предполагаю, что итерации внешнего цикла уже были завершены до того, как какой-либо асинхронный код получил какой-либо HTTP-ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...