C#

Вопрос по C#

При использовании цикла Parallel.For не сохраняются данные в переменную внутри цикла
 long sig01
long sig02

Parallel.For(0, 1, async i =>
{
long sig01 = (await m.AoBScan("EE A9 00 00 01 00 00 00 06", true, true, "")).FirstOrDefault(); // поиск 1

long sig02 = (await m.AoBScan("50 05 00 00 00 00 00 00 00 00 00 00 00 01", true, true, "")).FirstOrDefault(); // поиск 2
});

string address = sig01.ToString("X"); // замена 1
string nop = "0x";
address = nop.Insert(2, address);
byte[] newBytes01 = { 0x8E, 0xB9, 0x00 };
m.WriteBytes(address, newBytes01);

address = sig02.ToString("X"); // замена 2
nop = "0x";
address = nop.Insert(2, address);
byte[] newBytes02 = { 0x8E, 0xB9, 0x00 };
m.WriteBytes(address, newBytes02);
при замене в коде ошибка что переменная пуста хоть в цикле она заполняется, что делать?
(код не дописан в Parallel.For в дальнейшем будет больше поисков)
В коде, представленном в вопросе, переменные sig01 и sig02 объявлены внутри цикла Parallel.For, что делает их локальными для каждого потока. Поэтому, когда цикл завершается, значения этих переменных теряются. Чтобы сохранить значения переменных, нужно объявить их до цикла Parallel.For, а затем присваивать им значения внутри цикла. Например:
 long sig01 = 0; 
long sig02 = 0;

Parallel.For(0, 1, async i =>
{
sig01 = (await m.AoBScan("EE A9 00 00 01 00 00 00 06", true, true, "")).FirstOrDefault(); // поиск 1

sig02 = (await m.AoBScan("50 05 00 00 00 00 00 00 00 00 00 00 00 01", true, true, "")).FirstOrDefault(); // поиск 2
});

string address = sig01.ToString("X"); // замена 1
string nop = "0x";
address = nop.Insert(2, address);
byte[] newBytes01 = { 0x8E, 0xB9, 0x00 };
m.WriteBytes(address, newBytes01);

address = sig02.ToString("X"); // замена 2
nop = "0x";
address = nop.Insert(2, address);
byte[] newBytes02 = { 0x8E, 0xB9, 0x00 };
m.WriteBytes(address, newBytes02);
Таким образом, переменные sig01 и sig02 будут доступны после завершения цикла Parallel.For, и их значения можно использовать для замены в коде.
Александр Маслов
Александр Маслов
14 273
Лучший ответ
Владимир Майоров вроде бы в вашем примере вы просто скопировали мой код без изменений, и в моём коде и так переменные создаются вне цикла
Александр Маслов изменения в коде есть
Александр Маслов Проблема заключается в том, что переменные sig01 и sig02 объявлены внутри цикла Parallel.For, и поэтому они не видны вне этого цикла. Чтобы решить эту проблему, нужно объявить эти переменные до цикла Parallel.For, а затем присвоить им значения внутри цикла.
Сохраняются. Просто не надо описывать переменную сначала снаружи цикла, а потом еще раз такую же - внутри.
Ну и в твоем случае этот цикл не нужен. Он параллелизует ВСЕ ТЕЛО цикла, а не отденьные команды в нем, поэтому оборачиать в него что-то, что выполняется один раз, смысла нет никакого.
Евгений Киреев
Евгений Киреев
93 626
Проблема заключается в том, что переменные sig01 и sig02 объявлены внутри цикла Parallel.For и не могут быть использованы вне его. Чтобы решить эту проблему, вы можете объявить переменные sig01 и sig02 до цикла Parallel.For и использовать их внутри цикла.

Если у вас есть дополнительные вопросы, я буду рад помочь.
Владимир Майоров но ведь в моём коде переменные и так объявлены до цикла