Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 131

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 320 >> Следующая

internal class WorkerClass
{ public void ooScmatarkO {
Il Определяем эленент для мониторинга в целях синхронизации
Monitor. Enter(this);
try
{ //Выполнить работу..,
fordnt і = 0; і < 5; і++)
^ Console.WriteLinet "Worker says: {0}.". i): }
finally
Il Была ошибка или нет, а из нонитора придется выйти
Monitor.Exit(this);
, 1
)
Если мы запустим программу с этим вариантом класса ass. то ре.чульта-
не изменится по сравнению с рис. 6.47 (что не так и плохо). Обратите внимание на применение статических методов CntorU и ExitO для входа и выхода из участка
кода с блокировкой.
Применение System.Threading. Interlocked
В пространстве имен System.Threading предусмотрен также специальный тип, торвш позволяет увеличиватв или уменвшатв значение переменной на единицу потокобезопасным способом. Чтобы объяснить суть проблемы, проиллюстрируем ее на примере класса, который будет называться IHaveNoIdea. Пусть в этом классе будет внутренний счетчик ссылок refCount. Один из методов данного класса будет ответственен за приращение этого счетчика на единицу, а другой — за уменьшение его значения на ту же единицу (звучит знакомо, не правда ли?): public class IHaveNoIdea
private long rofcount -
public void AddRefO { ++refCount: }
public void Released
* if(-refCount = - 0)
{
GC.CollectO:
}
314 Глава 6 • Сборки, потоки и домены приложений
Предположим, что в текущем домене приложения сушестиует несколько потоков, которые делают вызовы AddRef(} ir 1 При этом расписание работы потоков вполне может сложиться таким образом, что значение refCount может стать отрицательным. Результат с точки зрения реакции программы на такое неожиданное значение может быть самым удивительным.
Чтобы не допустить возникновения подобной ситуации, можно воспользоваться классом System.Threading. Interlocked. Обратите внимание на передачу методам Increment О и Doer eine пі. С) ссылки на переменную refCount с применением ключевого слова
public class lH;veNcItiGa І
private long refCount - 0;
public void AddliefO {
Interlocked.Increment(ref refCount):
}
public void ReleaseO {
if(Irrterlocked.Decrement(ref refCount) = = 0) GC.CollectO;
}
)
}
К этому моменту вы уже обладаете достаточной информацией, чтобы представлять опасность в мире многопоточных сборок. Мы советуем вам самостоятельно рассмотреть также остальные типы пространства имен Syste^Tnresdin;; — вполне возможно, что они вам пригодятся,
Подведение итогов
В этой главе рассматривались особенности строения сборок .NET - файлов EXE и 0LL, которые так не похожи на обычные EXE и DLL приложений Win32. Мы познакомились с метаданными типов, манифестом и кодом промежуточного языка. Кроме того, мы выяснил и, в чем заключаются различия между частными сборками и сборками для общего пользования, а также разобрались с механизмом поиска сборок средой выполнения .NET и применением файлов конфигурации приложений.
Кроме того, в приложениях .NHT появился новый уровень, который находится между процессами и потоками — уровень доменов приложений. Домены приложений могут включать в себя любое количество потоков. Используя типы пространства имен System.Threading, мы можем создавать многопоточные приложения, а также реализовывать доступ к общим данным в многопоточ-
ных приложениях.
Рефлексия типов и программирование ГУ ^пользованием / атрибутов
Как уже говорилось в предыдущей главе, приложения .NET состоят из сборок Информацию о типах в сборках можно получить при помощи разных средстз Например, для этого можно использовать интегрированный Object Browser (Про-смотрщик объектов) в среде разработки Visual Studio.NET. Еще одно знакомое нам средство — это утилита ILDasm.exe. Однако доступ к информации о типах сборки можно получить и программными способами. Для этого предназначены типы, определенные в пространстве имен и именно об этом пойдет речь в этой главе.
После того как мы познакомимся с исследованием сборок в процессе выполнения — рефлексией типов, мы перейдем к рассмотрению тесно связанных с этой темой возможностей. Типы, определенные в пространстве имен System. Ref 1 ecti on. Emi t, позволяют создавать сборки прямо в процессе выполнения программы - «налету». Мы также убедимся, что применение позднего связывания может оказаться очень полезным и в приложениях (как мы увидим в следующих главах, позднее связывание очень важно для организации взаимодействия приложений .NETh традиционных приложений СОМ).
Глава заканчивается описанием того, как можно использовать внутри сборок .NET пользовательские метаданные путем применения встроенных и специально созданных нами атрибутов. Если вы пришли из мира СОМ, то вы увидите, что многие из полезных черт IDL нашли свое применение и дальнейшее развитие в .TSiET.
Что такое рефлексия типов
В мире .NET рефлексия — это процесс обнаружения типов во время работы программы. Используя рефлексию, мы можем во время выполнения загрузить сборку и получить о ней ту же информацию, которую показывает утилита ILDasm.exe. Например, мы можем получить список всех типов, определенных в указанном нами
Предыдущая << 1 .. 125 126 127 128 129 130 < 131 > 132 133 134 135 136 137 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100