2011-01-13 3 views
0

람다 식 루프에서 HTTPwebrequest BeginGetResponse를 호출합니다 (여기서 인덱스는 루프에서 매번 증가합니다).silverlight/wp7 : 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); 

답변

4

이것은 루프 변수를 캡처하는 일반적인 문제입니다. 람다 식은 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. . 그러나 부하 비슷한 대답을 질문가 다른 모든 실제 질문에 나는 개인적으로 희망 쉽게 찾을 수 있도록, 각각 다른 질문 대답 가치가 있다고 생각 :.

(참고 비슷한 질문이 있습니다.)

+0

WP7 컨텍스트에서도 처음 등장한 것으로 보입니다. 일부는이 태그에 대해 이와 같은 문제를 구체적으로 검색합니다. –

+0

많은 감사합니다! 그런 쉬운 수정을 와우와 나는 이것을 이해하려고 노력하는 데에 시간을 보냈다. 지식의 힘. :-) – gforg

0

, 내 생각이 비동기 코드 중 하나를 수신하기 전에 외부 루프 반복이 이미 완료된 것입니다 HTTP 응답.

관련 문제