Надо ли записывать объект в глобальную переменную, после изменений в нем ?

  • Автор темы Автор темы Phoenix78
  • Дата начала Дата начала

Phoenix78

Client
Регистрация
06.11.2018
Сообщения
11 789
Реакции
5 741
Баллы
113
Не до конца понял как работать с глобалками, поэтому вот такой вопрос. Кто знает ответ, откликнитесь :az:

Я привык работать с локальными переменными. считал значения , поменял, записал. все четко и понятно.
Но начал работать с глобалками и выяснил что в них можно не только значения передавать, а целые объекты пихать. :cd:
Ну начал работать по той же логике, считал объект, изменил и пихнул обратно. думал там сериализация какая нибудь прикручена... но случайно забыл в одном месте прописать запись в глобалку..... и код все равно отработал как надо :bm:
Подробно что делал
создал объект с начальными данными и пихнул в глобалку:
Развернуть Свернуть Копировать
// новый объект
var test_list = new List<string>();
test_list.Add("start");
project.GlobalVariables.SetVariable("test", "test", test_list);
сразу же вывел в лог
C#:
Развернуть Свернуть Копировать
// объект из глобалки
List<string> test_list_global = (List<string>) project.GlobalVariables["test", "test"].Value;
// вывод объекта в лог
for (int i = 0; i<test_list_global.Count; i++)
{
    project.SendInfoToLog(test_list_global[i]);
}
получил стартовый вариант
85581

теперь добавляю данные
Добавить данные:
Развернуть Свернуть Копировать
// объект из глобалки
List<string> test_list_global = (List<string>) project.GlobalVariables["test", "test"].Value;
// Добавить данные
test_list_global.Add("add");

И вот тут в коде нет записи в глобалку. я в текущем потоке добавил данные и не записал измененный объект в глобалку.
Выполняю код вывода в лог в другом шаблоне и получаю все данные которые внес другой шаблон :bk:
85582

То есть записывая объект в глобалку, мы получаем полнофункциональный развернутый объект в памяти и он доступен всем потокам ?
И не надо делать после изменений объекта project.GlobalVariables.SetVariable("test", "test", test_list_global ); что бы актуализировать его состояние ?
Я к чему это спрашиваю, переживаю за скорость выполнения в многопотоке, ну и конечно лень прописывать запись обратную, тем более что уже разок забыл это сделать. :bk:
И еще волнует вопрос, это стандартное поведение глобальных переменных или возможно как то не так они работают щас и возможно будет фикс и лучше перестраховаться и все таки писать в глобалки принудительно измененный объект ?
 
Значение переменных доступно всем потокам, пока не перезагрузишь постер, а когда постер перезагрузишь, будет значение по умолчанию, у меня таблица номер строки, прочитал строку +1, шаблон отработал и начинает сначала и уже номер строки которую я выставил перед этим в другом потоке.
 
Значение переменных доступно всем потокам, пока не перезагрузишь постер, а когда постер перезагрузишь, будет значение по умолчанию, у меня таблица номер строки, прочитал строку +1, шаблон отработал и начинает сначала и уже номер строки которую я выставил перед этим в другом потоке.
это понятно. вопрос в другом совсем.
я так и работал раньше , читал и писал значение в глобалку. ну там счетчики как у тебя или строки. щас я могу твою таблицу запихнуть полностью в глобалку и работать с ней в памяти.
Вот хочу выяснить критично ли постоянно записывать объект таблицы в глобалку или достаточно один раз ее туда запихнуть и просто работать как с локальным объектом в коде.
 
или пока не перезапустишь шаблон. Так по моему было.
нет. шаблоны не влияют на глобалки. Сам Зеннопостер их держит. Шаблон может только кривой логикой их сбросить до начального состояния.
 
ну если глобалки через ссылку работают, то конечно ничего удивительного :bk:
локальные то переменные работают немного по другому.
вообще удобненько, не надо париться с сохранением результата. залочил объект, поработал с ним и все. все данные будут валидные для всех потоков :cd:
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)