Цикл и задачи по каждому элементу - PullRequest
6 голосов
/ 28 мая 2010

Я знаю из руководств по кодированию, что я прочитал, вы не должны делать

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 Ответ

6 голосов
/ 28 мая 2010

Это абсолютно та же проблема с 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);
}
...