0

いくつかの処理のために異なるスレッドを生成しようとしています。for各スレッド内のいくつかのロジックにループ インデックスを使用します。
以下のコードで、異なるスレッドに 1,2,3,4,5 を出力させるにはどうすればよいですか? これを実行するたびに、3,3,3,4,6,6 & 2,2,3,5,5,6 などの異なる数値が出力として得られます
。 t それを正しく行う。誰でも私がこれを達成するのを手伝ってくれますか? 各スレッド/タスクが正しいインデックスを取得するようにしたいだけです。各タスクは別のスレッドで強制的に実行されることに注意してください。

List<Task> tasks1 = new List<Task>();
for (int j = 1; j <= 5; j++)
{    
   tasks1.Add(Task.Factory.StartNew(() =>
          {
              Console.WriteLine(j);
          }
          , new CancellationToken()
          , TaskCreationOptions.LongRunning
          , TaskScheduler.Default)
                                   );
}

Task.WaitAll(tasks1.ToArray());
Console.Read();
4

3 に答える 3

3

他の回答を完了するためだけに。C# 5.0 (.NET 4.5) では、ループ変数のクローズに関連して重大な変更がありましたが、foreachループ変数のクローズには関係ありませんでしたfor

Eric Lippertの詳細 (および序文の更新ノート) を参照してください。有害と見なされるループ変数のクローズと彼のループ変数のクローズ、パート 2

この問題は、マルチスレッドまたは TPL (タスク並列ライブラリ) の使用とは無関係であることに注意してください。

他の回答とコメントは、それが以前に議論されたことに言及しましたが、以前の回答のいずれにもリンクしていませんでした。相互リンクのために、いくつかを次に示します。

于 2013-06-05T02:18:08.367 に答える
2

何百万回も答えた。それは閉鎖に関連しています。以下のようにコードを変更します

 for (int j = 1; j <= 5; j++)
 {
     int temp = j;

     tasks1.Add(Task.Factory.StartNew(() =>
      {
          Console.WriteLine(temp);
      }, new CancellationToken(), TaskCreationOptions.LongRunning, TaskScheduler.Default)

     );
 }

これを読むことをお勧めします:ループ変数とクロージャ

于 2013-06-04T21:13:00.463 に答える