Могу ли я использовать локальные переменные внутри параллельного Foreach l oop (без непреднамеренного переписывания предыдущего значения) - PullRequest
2 голосов
/ 13 апреля 2020

Итак, я пытаюсь обрабатывать записи по одной строке за раз. Я новичок в многопоточных средах, и меня попросили использовать Parallel.Foreach L oop. Я хотел знать, как обрабатываются локальные переменные в режиме параллельного выполнения. Ниже приведен мой код.

Parallel.ForEach(dtReportData.Tables[0].AsEnumerable(), drow =>
{
string strType = drow["type"];
//Based on this type, I am executing logic from a switch case.

});

Сейчас. Я хочу знать, могу ли я объявить и присвоить значение переменной внутри l oop. Для примера предположим, что параллельно работают 2 потока.

Поток 1 извлек запись и предположим, что значение, которое было выбрано, было "Type1" и сохранено в strType. Теперь я хочу, чтобы мой код выполнял логи c для типа «Тип1» (предположим, что мы написали для него регистр переключения)

Однако давайте предположим, что перед тем, как поток 1 начнет выполнять логи c, поток 2 вступает в игру. Поток 2 назначает значение "Type2" для strType.

Теперь, когда поток 1 перейдет в мой блок Switch, какое значение он будет содержать? Будет ли это «Тип1» или «Тип2».

Обратите внимание, что я глобально не объявляю значение переменной String вне Foreach l oop, оно внутри l oop, и я считаю, что каждый раз создается новый экземпляр.

1 Ответ

0 голосов
/ 14 апреля 2020

Переменная strType является локальной для этого лямбда-вызова, и никакой другой поток не может ее увидеть или изменить. Его значение хранится в стеке текущего потока. Каждый поток имеет свой собственный стек размером 1 МБ .

. Обратите внимание, что классы ADO. NET в целом и класс DataTable в частности, не являются потокобезопасными. Если вы попытаетесь мутировать их из нескольких потоков параллельно, их внутреннее состояние может быть повреждено, а их поведение станет неопределенным.

...