Хранение объекта на уровне проекта

Sample

Client
Регистрация
31.01.2016
Сообщения
25
Благодарностей
4
Баллы
3
Наверняка это уже спрашивали, но не могу на форуме найти эту информацию.

Нужно хранить объект, который будет доступен всем инстансам проекта, однако ничего не получается сделать.

Я вижу три пути:
  1. GlobalVariables
  2. project.Context
  3. static var

И вот что я думаю:
1) Через глобальные переменные мне удалось это сделать. Используя lock(CommonCode.SyncObject) я загружаю в переменную данные, заставляя остальные потоки (инстансы) ждать. Но здесь я могу работать только с текстовыми значениями. Сложный объект я положить в такую переменную не могу.

2) project.Context казался для меня очевидным выбором и я думал, что проблем с этим не будет, однако несмотря на то, что первый инстанс также лочит SyncObject и кладет в контекст нужные данные, все остальные потоки считают что этой переменной в контексте нет и делают то же самое.
Что не так? Мне надо синхронизироваться на чем-то другом? Или это и не будет работать?

3) Static var, как мне кажется, отработает как надо, но все-таки не хочется использовать статическую переменную для хранения сложного объекта. Или это единственный выход?

Заранее спасибо за помощь.
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
project.Context уникален для каждого потока.

Используйте static с локом или паттерн Singleton
 
  • Спасибо
Реакции: Sample

Sample

Client
Регистрация
31.01.2016
Сообщения
25
Благодарностей
4
Баллы
3
Получилось как-то так.
Может кому пригодится, а может кто-то увидит какую-нибудь ошибку и поправит.

Общий код:
Код:
namespace ZennoLab.OwnCode
{
    public class CommonCode
    {
        public static object SyncObject = new object();
        public static TestObject testObject = new TestObject();
    }
  
    //статусы объекта
    public enum Status {
        NOT_INITIALIZED,
        BUSY,
        INITIALIZED
    }
  
    //объект этого класса будем синхронизировать
    public class TestObject
    {
        public string testString {get;internal set;}      
        public Status initilized {get; internal set;}      
      
        public void initilize (string testString)
        {
            this.testString = testString;          
            initilized = Status.INITIALIZED;
        }
      
        public void block()
        {
            initilized = Status.BUSY;
        }
      
        public void kill()
        {
            testString = null;          
            initilized = Status.NOT_INITIALIZED;
        }
    }
}
Код, который синхронизируется:

Код:
lock(CommonCode.testObject) {
    try {
        if (CommonCode.testObject.initilized == Status.NOT_INITIALIZED)
        {
            throw new KeyNotFoundException();
        }
        return "busy";
    } catch (KeyNotFoundException ex) {
        CommonCode.testObject.initilized = Status.BUSY;
        project.SendInfoToLog("Will read file", true);
        return "false";
    }
}
Ожидание инициализации:

Код:
var xml = "";
while (CommonCode.testObject.initilized != Status.INITIALIZED)
{
     Thread.Sleep(1000);
     project.SendInfoToLog("waiting...", true);
     xml = CommonCode.testObject.testString;
}
return xml;
Ну а где-то в других экшенах мы инициализируем объект и всё будет ок.
 

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