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

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

Trader1985

Client
Регистрация
14.12.2011
Сообщения
135
Реакции
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();"

Вопрос: Всё это изначально была дурацкая идея, и надо просто пользоваться встроенными в Зеннку списками и таблицами? ))
 
ну или обычной переменной постера воспользоваться, она же во всех кубиках доступна
 
Здрасьте, люди добрые! Сам до конца не понимаю чего хочу, но попробую объяснить :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
Если прям между кубиками надо прокидывать объект, то в контекст кидай и забирай в следующем месте.
Только учти, что контекст обнуляется при любом изменении в шаблоне и тебе придется инициировать его заново.
Небольшой нежданцик :)
 
  • Спасибо
Реакции: Trader1985
Тут пригодится несахарный аналог ThreadStatic, но для постера:

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

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

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

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

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

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

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

В таком случае как будто лучше уже на визуал студию переходить
 
  • Спасибо
Реакции: Trader1985

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