Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Инспектирование контекста объекта



Хотя необходимость программного взаимодействия с контекстом при написании

приложений возникает очень редко, один пример того, как это делается, рассмотреть не помешает. Давайте создадим новый проект типа Console Application по имени

ContextManipulator и определим в нем один контекстно-свободный класс (SportsCar)

и один контекстно-зависимый (SportsCarTS):

using System.Runtime.Remoting.Contexts; // Для типа Context.

using System.Threading; // Для типа Thread.

// SportsCar не имеет никаких специальных контекстных потребностей и будет

// загружаться в создаваемый по умолчанию контекст внутри домена приложения.

class SportsCar

{

public SportsCar ()

{

// Получение информации о контексте и отображение его идентификатора.

Context ctx = Thread.CurrentContext;

Console.WriteLine("{0} object in context {1}", this.ToString(), ctx.ContextID);

foreach(IContextProperty itfCtxProp in ctx.ContextProperties)

Console.WriteLine("-> Ctx Prop: {0}", itfCtxProp.Name);

}

}

// Тип SportsCarTS требует загрузки в синхронизированный контекст.

[Synchronization]

class SportsCarTS: ContextBoundObject

{

public SportsCarTS()

{

// Получение информации о контексте и отображение его идентификатора.

Context ctx = Thread.CurrentContext;

Console.WriteLine("{0} object in context {1}", this.ToString(), ctx.ContextID);

foreach(IContextProperty itfCtxProp in ctx.ContextProperties)

Console.WriteLine("-> Ctx Prop: {0}", itfCtxProp.Name);

}

}

Здесь важно обратить внимание, что каждый конструктор получает тип Context

из текущего потока выполнения через статическое свойство Thread.CurrentContext.

За счет использования объекта Context можно легко отображать статистические

данные о контексте, такие как присвоенный ему идентификатор, а также ряд

дескрипторов, получаемых через Context.ContextProperties. Это свойство возвращает объект, реализующий интерфейс IContextProperty, который предоставляет доступ к каждому дескриптору через свойство Name. Теперь модифицируем метод Main() так, чтобы он размещал экземпляр каждого из этих классов:

static void Main(string[] args)

{

Console.WriteLine("***** Fun with Object Context *****\n");

// При создании этих объектов будет отображаться информация об их контексте.

SportsCar sport = new SportsCarO;

Console.WriteLine ();

SportsCar sport2 = new SportsCarO;

Console.WriteLine ();

SportsCarTS synchroSport = new SportsCarTS();

Console.ReadLine();

}

По мере создания объектов конструкторы классов будут отображать различные

фрагменты касающейся их контекста информации, как показано на рис. 5.

Из-за того, что класс SportsCar не был снабжен атрибутом контекста, CLR-среда

разместила объекты sport и sport2 в контексте с идентификатором 0 (т.е. в контексте по умолчанию). Объект SportsCarTS, однако, был загружен в уникальный контекст (с идентификатором 1), поскольку его контекстно-зависимый класс был снабжен

атрибутом [Synchronization].

Рис. 5. Изучение информации о контексте объекта





Дата публикования: 2015-07-22; Прочитано: 208 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...