Цикл foreach и задачи

Я знаю из codeing инструкций, что читал, Вы не должны делать

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

как это запишет 5 5's, я понимаю, что и думаю, что я понимаю, почему это происходит. Я знаю, что решение состоит в том, чтобы только сделать

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();

Или сделайте я должен сделать то же самое, в котором я выполнил для цикла.

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass;
    Task.Factory.StartNew(() => localMyClass.DoAction());
}
Console.ReadLine();
6
задан Scott Chamberlain 28 May 2010 в 13:09
поделиться

1 ответ

Это абсолютно такая же проблема с 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);
}
6
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: