1

使用可能なプロセッサの数に依存するタスクのリストを作成しようとしています。奇妙な動作をしているように見える for ループがあります。私はJavaScriptのクロージャーの概念を認識しており、ここで同様のことが起こっているようです:

 var tasks = new Task[Environment.ProcessorCount]; 
 for(int x = 0; x < Environment.ProcessorCount; x ++)
 {
      tasks[x] = Task.Run(() => new Segment(SizeOfSegment, x * SizeOfSegment, listOfNumbers).generateNewList());
 }

私が見つけているのは、for ループの行を中断すると、変数 x が正しいように見えるため、0 から始まり 3 で終わることです (プロセッサの数は 4)。しかし、Segment のコンストラクター内にブレーク ポイントを配置すると、コール スタックに戻ったときに x が実際には 4 であることがわかりました。

どんな助けでも大歓迎です。

4

1 に答える 1

7

xラムダ式内でキャプチャしていますが、ループの過程で値を変更する単一の変数があるため、タスクが実際に 実行されるまでに、異なる値になる可能性があります。ループ内で変数のコピーを作成し、反復ごとに新しい「変数インスタンス」を作成する必要があります。次に、その変数を安全にキャプチャできます。x

for(int x = 0; x < Environment.ProcessorCount; x ++)
{
    int copy = x;
    tasks[x] = Task.Run(() => new Segment(SizeOfSegment,
                                          copy * SizeOfSegment,
                                          listOfNumbers).generateNewList());
}

( .NET 命名規則に準拠するために、名前generateNewListをに変更することもお勧めします。)GenerateNewList

于 2013-01-11T06:48:29.927 に答える