2011-01-13 16 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変数をキャプチャします。ここでは、代わりにindexindexCopyをキャプチャしている

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

- ちょうど index変数があります一方、ループの各反復で新しいindexCopy変数があります:それはしかし、簡単な修正です。 indexの値は時間とともに変化しますが、indexCopyの値は変わりません。大丈夫です。

Eric Lippertには、これに関するブログ記事の投稿があります:part 1; part 2

は(注:同様の答えを持っている質問の負荷がありますが、異なっているすべて実際のの質問私は個人的にそれがうまくいけば、それは簡単に見つけることにするために、それぞれ異なる質問に答える価値があると思います。これからも同様の質問が出ます)

+0

これはWP7の文脈でも登場しているようです。いくつかは、このような問題のためにそのタグを具体的に検索します。 –

+0

ありがとう!このような簡単な修正をすごして、これを理解しようと時間を費やしました。知識の力。 :-) – gforg

0

コード全体を見なければ、私の推測では、非同期コードのいずれかが任意のHTTPを受けた前外側のループの反復がすでに完了しているということです応答。

関連する問題