обновление из потока
От: vvv848165@ya.ru  
Дата: 05.04.19 10:28
Оценка: -1
для обновления компонентов из потока очень часто используют BeginInvoke к примеру:

chart1.BeginInvoke((MethodInvoker)(() =>Action(spectr)));

когда передан в функцию spectr через аргумент — то всё нормально
но если через глобальную переменную — то постоянно ошибки синхронизации
я защитил данные мутексом — всё стало нормально...
НЕУЖЕЛИ C# копирует spectr перед вызовом Action в основной поток ???
или что это было?
Re: обновление из потока
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.04.19 11:51
Оценка: +1
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>для обновления компонентов из потока очень часто используют BeginInvoke к примеру:


VYR>chart1.BeginInvoke((MethodInvoker)(() =>Action(spectr)));

VYR>НЕУЖЕЛИ C# копирует spectr перед вызовом Action в основной поток ???
Да.
VYR>или что это было?
Это было т.н. замыкание (closure).

"локальные переменные" при использовании их в лямбдах трансформируются — генерируется специальный класс, в котором переменная становится полем; тело лямбды становится методом этого класса.
Таким образом, время жизни "переменной" продлевается за пределы времени жизни текущего фрейма стека.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.