Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №6
Шрифт:

Остальные конструкторы определяются через рассмотренный выше:

public SynchronizationAttribute

: this(REQUIRED, false) {}

public SynchronizationAttribute(bool reEntrant)

: this(REQUIRED, reEntrant) {}

public SynchronizationAttribute(int flag)

: this(flag, false) {}

Теперь рассмотрим важнейший для правильного понимания и использования атрибута синхронизации вопрос — реализацию методов IsContextOK и GetPropertiesForNewContext.

Начнем с виртуального метода IsContextOK,

объявленного в интерфейсе IContextAttribute и реализованного в классе ContextAttribute. В рассматриваемом коде из SSCLI этот метод переопределяется следующим образом:

public override bool IsContextOK(Context ctx,

IConstructionCallMessage msg) {

if (ctx == null)

throw new ArgumentNullException("ctx");

if (msg == null)

throw new ArgumentNullException("msg");

bool isOK = true;

if (_flavor == REQUIRES_NEW) {

isOK = false;

}

else {

SynchronizationAttribute syncProp =

(SynchronizationAttribute) ctx.GetProperty(PROPERTY_NAME);

if (((_flavor == NOT_SUPPORTED)&&(syncProp!= null))

|| ((_flavor == REQUIRED)&&(syncProp == null))

) {

sOK = false;

}

if (_flavor == REQUIRED) {

_cliCtxAttr = syncProp;

}

}

return isOK;

}

Таким образом контекст ctx признается непригодным для жизни экземпляра класса описанного с атрибутом синхронизации в следующих случаях:

1. В конструкторе атрибута был задан флаг REQUIRES_NEW

2. В контексте ctx имеется свойство контекста с именем "Synchronization" типа SynchronizationAttribute, а в конструкторе атрибута был явно задан флаг NOT_SUPPORTED

3. В контексте ctx нет свойства контекста с именем "Synchronization" типа SynchronizationAttribute, но при вызове конструктора атрибута был выбран (явно или неявно) флаг required.

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

Эти правила определяют условия размещения нового объекта в старом контексте или необходимость формирования нового контекста. Однако остается вопрос о домене синхронизации. Когда новый контекст, если он был построен, будет включен в тот домен синхронизации, в который входит контекст ctx?

Обратим внимание на строки

if (_flavor == REQUIRED) {

_cliCtxAttr = syncProp;

}

Переменная syncProp равна null или ссылке на свойство контекста ctx с именем "Synchronization" типа SynchronizationAttribute. Таким образом, при заданном флаге REQUIRED в поле _cliCtxAttr типа SynchronizationAttribute в текущем экземпляре атрибута синхронизации сохраняется ссылка на одноименное свойство контекста ctx.

Это подготовка к включению нового контекста (если он понадобится) в домен синхронизации, в который уже входит контекст ctx. Подробнее этот вопрос будет изложен при комментировании кода метода GetPropertiesForNewContext.

Теперь обратимся к методу GetPropertiesForNewContext:

public override void GetPropertiesForNewContext {

IConstructionCallMessage ctorMsg) {

if ((_flavor==NOT_SUPPORTED) || (_flavor==SUPPORTED) ||

(null == ctorMsg)) {

return;

}

if (_cliCtxAttr!= null) {

ctorMsg.ContextProperties.Add(

(IContextProperty)_cliCtxAttr);

_cliCtxAttr = null;

}

else {

ctorMsg.ContextProperties.Add((IContextProperty)this);

}

}

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

Единственный аргумент ctorMsg типа IConstructionCallMessage должен быть сообщением, передаваемым со стороны клиента на сторону сервера и содержащим необходимую информацию об активируемом объекте. Роль рассматриваемого метода состоит в добавлении в это сообщение дополнительной информации. Именно, добавляется ссылка на объект типа IContextProperty, который будет играть роль свойства синхронизации нового контекста (свойство типа SynchronizationAttribute с именем "Synchronization").

Из приведенного кода видно, что исходное сообщение ctorMsg никак не меняется, если при задании атрибута был выбран флаг not_supported или supported, иными словами, если активируемый объект не должен жить в контексте синхронизации или разработчику все равно.

В противном случае возможны два варианта:

_cliCtxAttr == null

Этот случай возникает, когда либо старый контекст не поддерживает сервис синхронизации, либо атрибут синхронизации был задан с флагом REQUIRES_NEW. В этом случае в качестве ссылки на свойство синхронизации в сообщение ctorMsg включается ссылка на новый экземпляр атрибута синхронизации, который активируется системой еще до активации нового объекта. Таким образом получается новый контекст синхронизации, никак не связанный с каким-либо из ранее созданных контекстов синхронизации. Этот новый контекст синхронизации образует и новый домен синхронизации.

• _cliCtxAttr!= null

В этом случае cliCtxAttr является ссылкой на свойство синхронизации старого контекста и именно эта ссылка включается в сообщение ctorMsg как ссылка на свойство синхронизации нового контекста. Таким образом оба контекста синхронизации (старый и новый) имеют одно и то же свойство синхронизации. В этом случае говорят, что оба контекста принадлежат одному домену синхронизации.

Теперь уместно отметить одну особенность домена синхронизации, связанную с реентерабельностью. Предположим, что активируется экземпляр o1 некоторого класса, описанного с атрибутом

Поделиться:
Популярные книги

Ванька-ротный

Шумилин Александр Ильич
Фантастика:
альтернативная история
5.67
рейтинг книги
Ванька-ротный

Зубы Дракона

Синклер Эптон Билл
3. Ланни Бэдд
Проза:
историческая проза
5.00
рейтинг книги
Зубы Дракона

Мымра!

Фад Диана
1. Мымрики
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мымра!

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21

На осколках разбитых надежд

Струк Марина
Любовные романы:
исторические любовные романы
5.00
рейтинг книги
На осколках разбитых надежд

Поле боя – Земля

Хаббард Рональд Лафайет
Фантастика:
научная фантастика
7.15
рейтинг книги
Поле боя – Земля

На границе империй. Том 7. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

Госпожа Доктор

Каплунова Александра
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Госпожа Доктор

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Пророк, огонь и роза. Ищущие

Вансайрес
Фантастика:
фэнтези
5.00
рейтинг книги
Пророк, огонь и роза. Ищущие

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шайтан Иван

Ротмистр Гордеев

Дашко Дмитрий Николаевич
1. Ротмистр Гордеев
Фантастика:
фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Ротмистр Гордеев