Потокобезопасные свойства класса

Trader1985

Client
Регистрация
14.12.2011
Сообщения
133
Благодарностей
31
Баллы
28
Здрасьте, люди добрые! Сам до конца не понимаю чего хочу, но попробую объяснить :D

В общем, создал я класс в общем коде в котором есть свойство, допустим:

C#:
public class MyGovnokod
{
     public static bool TestProperty { get; set; } = false;
}
В экшене C#, в проекте, я переназначаю это поле:
C#:
MyGovnokod.TestProperty = true;
return MyGovnokod.TestProperty;
И вроде всё классно: я могу создавать всякие флаги-переменные, списки в классе, чтобы потом работать с ними из любого места в проекте так как у свойств модификатор доступа "static". Но, оказалось что это плохая идея, ибо свойство у которого "static" ведёт себя, по сути, как "project.GlobalVariables": после того как основой поток закончит выполнять шаблон, значения полей не сбрасываются когда начинаеться новый цикл выполнения шаблона, более того, значения поля одинаково для всех других потоков выполняющий этот шаблон. Т.е. в моём пример как один раз установил "MyGovnokod.TestProperty = true;" так у всех потоков и будет "true".

Понятно, что мне нужно убрать модификатор "static",
C#:
public class MyGovnokod
{
    public bool TestProperty { get; set; } = false;       
}
и создать экземпляр класса, чтобы значения полей были уникальны в для каждого потока.
C#:
MyGovnokod myGovnokod = new MyGovnokod();
return myGovnokod.TestProperty;
Но, в таком случае, инициализировав поле класса нужными мне данными, я не могу получить эти значения ИЗ ЛЮБОГО C# кубика, в другом кубике я могу создать только другой, новый экземпляр "MyGovnokod myGovnokod = new MyGovnokod();"

Вопрос: Всё это изначально была дурацкая идея, и надо просто пользоваться встроенными в Зеннку списками и таблицами? ))
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 458
Благодарностей
834
Баллы
113
ну или обычной переменной постера воспользоваться, она же во всех кубиках доступна
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 343
Благодарностей
891
Баллы
113
Здрасьте, люди добрые! Сам до конца не понимаю чего хочу, но попробую объяснить :D

В общем, создал я класс в общем коде в котором есть свойство, допустим:

C#:
public class MyGovnokod
{
     public static bool TestProperty { get; set; } = false;
}
В экшене C#, в проекте, я переназначаю это поле:
C#:
MyGovnokod.TestProperty = true;
return MyGovnokod.TestProperty;
И вроде всё классно: я могу создавать всякие флаги-переменные, списки в классе, чтобы потом работать с ними из любого места в проекте так как у свойств модификатор доступа "static". Но, оказалось что это плохая идея, ибо свойство у которого "static" ведёт себя, по сути, как "project.GlobalVariables": после того как основой поток закончит выполнять шаблон, значения полей не сбрасываются когда начинаеться новый цикл выполнения шаблона, более того, значения поля одинаково для всех других потоков выполняющий этот шаблон. Т.е. в моём пример как один раз установил "MyGovnokod.TestProperty = true;" так у всех потоков и будет "true".

Понятно, что мне нужно убрать модификатор "static",
C#:
public class MyGovnokod
{
    public bool TestProperty { get; set; } = false;      
}
и создать экземпляр класса, чтобы значения полей были уникальны в для каждого потока.
C#:
MyGovnokod myGovnokod = new MyGovnokod();
return myGovnokod.TestProperty;
Но, в таком случае, инициализировав поле класса нужными мне данными, я не могу получить эти значения ИЗ ЛЮБОГО C# кубика, в другом кубике я могу создать только другой, новый экземпляр "MyGovnokod myGovnokod = new MyGovnokod();"

Вопрос: Всё это изначально была дурацкая идея, и надо просто пользоваться встроенными в Зеннку списками и таблицами? ))
Созданный экземпляр клади в project.Context и в другом кубике доставай обратно.
C#:
MyGovnokod myGovnokod = new MyGovnokod();
project.Context["mycod"] = myGovnokod;
В другом кубике
C#:
var myGovnokod = project.Context["mycod"];
 
  • Спасибо
Реакции: Alex.A и Trader1985

Alex91

Известная личность
Read only
Регистрация
15.08.2024
Сообщения
880
Благодарностей
251
Баллы
63
Если прям между кубиками надо прокидывать объект, то в контекст кидай и забирай в следующем месте.
Только учти, что контекст обнуляется при любом изменении в шаблоне и тебе придется инициировать его заново.
Небольшой нежданцик :-)
 
  • Спасибо
Реакции: Trader1985

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 571
Благодарностей
3 395
Баллы
113
Тут пригодится несахарный аналог ThreadStatic, но для постера:

Объект с Dictionary внутри + project + доп., работа с которыми в методах объекта только через lock.

При первой установке значения, в методе устанавливать project и номер потока на основе счётчика (счётчик последнего ID, чтобы не чекать на дубли, но можно переполнить), либо GUID (но надо чекать дубли),
который потом добавлять в (условно техническую) локальную переменную PM + в Dictionary глобального объекта.

Добавление и получение в/из локальной переменной PM лучше сделать в методах данного объекта,
чтобы не подставлять в каждом сниппете одинаковое для всех потоков техническое название переменной (которое вы можете придумать сами).

Разрегистрацию в BadEnd и GoodEnd, но м.б. тут возможно реализовать доп. логику на IDisposable.

т.е. ThreadStatic, но не для потоков винды, а для потоков постера,
в котором можно хранить уникальный для потока постера объект.
 
Последнее редактирование:
  • Спасибо
Реакции: Trader1985

Trader1985

Client
Регистрация
14.12.2011
Сообщения
133
Благодарностей
31
Баллы
28
Yuriy Zymlex нихрена не понятно, но очень интересно)) Так-то словари освоил, полезная тема, но боюсь всё слишком усложнить.
В общем, спасибо большое за советы, буду тестировать. Только относительно недавно освоил принципы ООП-программирования.
"номер потока на основе счётчика" - да-да, кстати, тоже про это думал.

Dr.Pipetka, кажется это именно то, что мне нужно: создал объект, назначил его поля и передал этот объект в "project.Contex". Супер! Надеюсь в этот "project.Context" можно много разных объектов запихать стразу?

А "project.Variables" пользоваться не вариант потому что проект уже разрастается, очень много кода стало, хочу всё рассортировать по своим классам в "общем коде".
 
Последнее редактирование:

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 343
Благодарностей
891
Баллы
113
  • Спасибо
Реакции: Trader1985

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 458
Благодарностей
834
Баллы
113
А "project.Variables" пользоваться не вариант потому что проект уже разрастается, очень много кода стало, хочу всё рассортировать по своим классам в "общем коде".
В таком случае как будто лучше уже на визуал студию переходить
 
  • Спасибо
Реакции: Trader1985

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