Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Хотя необходимость программного взаимодействия с контекстом при написании
приложений возникает очень редко, один пример того, как это делается, рассмотреть не помешает. Давайте создадим новый проект типа 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!