代码之家  ›  专栏  ›  技术社区  ›  Scott Chamberlain

foreach循环和任务

  •  6
  • Scott Chamberlain  · 技术社区  · 15 年前

    我从编码指南中知道,我读过你不应该这样做。

    for (int i = 0; i < 5; i++) 
    { 
        Task.Factory.StartNew(() => Console.WriteLine(i));
    }
    Console.ReadLine();
    

    因为它会写5个5,我理解这一点,我想我理解它发生的原因。我知道解决办法就是

    for (int i = 0; i < 5; i++) 
    { 
        int localI = i;
        Task.Factory.StartNew(() => Console.WriteLine(localI));
    }
    Console.ReadLine();
    

    但是这样的事情可以吗?

    foreach (MyClass myClass in myClassList) 
    { 
        Task.Factory.StartNew(() => myClass.DoAction());
    }
    Console.ReadLine();
    

    或者我需要做和for循环中相同的事情。

    foreach (MyClass myClass in myClassList) 
    { 
        MyClass localMyClass = myClass;
        Task.Factory.StartNew(() => localMyClass.DoAction());
    }
    Console.ReadLine();
    
    1 回复  |  直到 15 年前
        1
  •  6
  •   Darin Dimitrov    15 年前

    这绝对是同一个问题 foreach . 下列内容:

    foreach (MyClass myClass in myClassList) 
    { 
        Task.Factory.StartNew(() => myClass.DoAction());
    }
    

    最有可能总是在列表的最后一个元素上调用doaction方法,可以这样修复:

    foreach (MyClass myClass in myClassList) 
    { 
        MyClass localMyClass = myClass;
        Task.Factory.StartNew(() => localMyClass.DoAction());
    }
    

    但我建议您不要依赖局部变量,而是使用以下方法:

    for (int i = 0; i < 5; i++)
    {
        Task.Factory.StartNew(localI => Console.WriteLine(localI), i);
    }