Копии переменных в многопоточных циклах foreach, вопросC#

Место общения программистов C#
Anonymous
Копии переменных в многопоточных циклах foreach, вопрос

Сообщение Anonymous »

У меня есть следующий код

Код: Выделить всё

List listString = new List();

//Do stuff to populate listString
listString =  populateList();

foreach(string var in listString)
{
Task.Run(async () => await ProcessVar(var));
}
В приведенном выше коде я обнаружил, что время от времени два потока будут использовать одни и те же значения переменной, и вместо этого я видел рекомендации делать это:

Код: Выделить всё

List listString = new List();

//Do stuff to populate listString
listString =  populateList();

foreach(string var in listString)
{
string varCopy = var;
Task.Run(async () => await ProcessVar(varCopy));
}
Это решает проблему. Но если я использую собственный класс вместо строки, должно ли произойти то же самое?

Код: Выделить всё

List listCustom = new List();

//Do stuff to populate listCustom
listCustom =  populateList();

foreach(CustomClass var in listCustom)
{
Task.Run(async () => await ProcessVar(var));
}
Кажется, что это работает каждый раз без проблем, которые я видел. Но стоит ли мне вообще это делать:

Код: Выделить всё

List listCustom = new List();

//Do stuff to populate listCustom
listCustom =  populateList();

foreach(CustomClass var in listCustom)
{
CustomClass varCopy = var;
Task.Run(async () => await ProcessVar(varCopy));
}
Это замедляет работу программы из-за количества экземпляров пользовательского класса, который тяжелее строки.

Вернуться в «C#»