2

このコードが範囲外の例外を返す理由を知っていますか?
たとえば、leastAbstractionsのListインスタンスにcount == 10がある場合、ループは11回の実行をi = 10で実行し、この例外を返します。それだけで10回を実行していますが、私==これらのタスクの一部は実行時までに10 -パラレルコードがOutOfRangeExceptionをスローする

for (int i = 0; i < leastAbstractions.Count; i++) 
{ 
    Task.Factory.StartNew((object state) => 
    { 
     this.Authenticate(new HighFragment(leastAbstractions[i])).Reactivate(); 
    }, TaskCreationOptions.PreferFairness); 
} 

答えて

4

あなたのループが11回実行実際ではありません。

これは通常の問題です。ラムダ式でループ変数をキャプチャしています。ただ、カウンターのコピーを取り、代わりにそのをキャプチャ:

for (int i = 0; i < leastAbstractions.Count; i++) 
{ 
    int copy = i; 
    Task.Factory.StartNew((object state) => 
    { 
     this.Authenticate(new HighFragment(leastAbstractions[copy])) 
            .Reactivate(); 
    }, TaskCreationOptions.PreferFairness); 
} 

その方法は、あなたのタスクが実行されたとき、あなたはあなたが撮影しcopyの「インスタンス」の現在の値が表示されなかっだろう - と、その値を決して変更は、iの値と異なります。

Eric Lippertさんのブログ記事はpart 1です。 part 2

+0

新しいタスクの作成では、カウンタが引数としてすぐに渡されると考えました。私は間違っていたと思う。ありがとう。 – pevogam

+0

@blaze:ラムダ式*でカウンタ*を使用しています。ラムダ式が実行されると、キャプチャしているものの*現在の値が使用されます。ラムダ式はあなたの仕事が意味するものなので、それは別のスレッドで起こらなければなりません。 –

関連する問題