
- •Сборки (assembly) в среде .Net. Проблема версионности сборок и ее решение.
- •Номер версии в .Net
- •Сведения о версии
- •Номер версии сборки
- •Информационная версия сборки
- •Общая система типов данных в среде .Net. Размерные и ссылочные типы данных. Типы, переменные и значения
- •Пользовательские типы
- •Система общих типов cts
- •Ссылочные типы
- •Типы литеральных значений
- •Неявные типы, анонимные типы и типы, допускающие значение null
- •Упаковка и распаковка размерных типов данных в среде .Net.
- •Производительность
- •Упаковка–преобразование
- •Распаковка-преобразование
- •Ссылочные типы данных. Объектная модель в среде .Net и языке c#.
- •Модели ручной и автоматической утилизации динамической памяти, их сравнительная характеристика. Модель с ручным освобождением памяти
- •Модель с автоматической «сборкой мусора»
- •Модель автоматической утилизации динамической памяти, основанная на сборке мусора. Проблема недетерминизма.
- •Модель автоматической утилизации динамической памяти, основанная на аппаратной поддержке (тегированной памяти).
- •Сборка мусора в среде .Net. Построение графа достижимых объектов.
- •Сборка мусора в среде .Net. Механизм поколений объектов.
- •Модель детерминированного освобождения ресурсов в среде .Net. Интерфейс iDisposable и его совместное использование с завершителем (методом Finalize).
- •«Мягкие ссылки» и кэширование данных в среде .Net.
- •Краткие и длинные слабые ссылки
- •Краткая ссылка
- •Длинная ссылка
- •Правила использования слабых ссылок
- •Динамические массивы в среде .Net и языке c#.
- •Приведение типов в массивах
- •Все массивы неявно реализуют /Enumerable, /Collection и iList
- •Передача и возврат массивов
- •Создание массивов с ненулевой нижней границей
- •Производительность доступа к массиву
- •Небезопасный доступ к массивам и массивы фиксированного размера
- •Делегаты в среде .Net и механизм их работы. Знакомство с делегатами
- •Использование делегатов для обратного вызова статических методов
- •Использование делегатов для обратного вызова экземплярных методов
- •Правда о делегатах
- •Использование делегатов для обратного вызова множественных методов (цепочки делегатов)
- •Поддержка цепочек делегатов в с#
- •Расширенное управление цепочкой делегатов
- •Упрощение синтаксиса работы с делегатами в с#
- •Упрощенный синтаксис № 1: не нужно создавать объект-делегат
- •Упрощенный синтаксис № 2: не нужно определять метод обратного вызова
- •Упрощенный синтаксис № 3: не нужно определять параметры метода обратного вызова
- •Упрощенный синтаксис № 4: не нужно вручную создавать обертку локальных переменных класса для передачи их в метод обратного вызова
- •Делегаты и отражение
- •События в среде .Net; реализация событий посредством делегатов. События
- •Этап 1: определение типа, который будет хранить всю дополнительную информацию, передаваемую получателям уведомления о событии
- •Этап 2: определение члена-события
- •Этап 3: определение метода, ответственного за уведомление зарегистрированных объектов о событии
- •Этап 4: определение метода, транслирующего входную информацию в желаемое событие
- •Как реализуются события
- •Создание типа, отслеживающего событие
- •События и безопасность потоков
- •Явное управление регистрацией событий
- •Конструирование типа с множеством событий
- •Исключительные ситуации и реакция на них в среде .Net. Достоинства
- •Механика обработки исключений
- •Блок try
- •Блок catch
- •Блок finally
- •Генерация исключений
- •Определение собственных классов исключений
- •Исключения в платформе .Net Framework
- •Исключения и традиционные методы обработки ошибок
- •Управление исключениями средой выполнения
- •Фильтрация исключений среды выполнения
- •21 Средства многопоточного программирования в среде .Net. Автономные потоки. Пул потоков.
- •Создание и использование потоков
- •Запуск и остановка потоков
- •Методы управления потоками
- •Безопасные точки
- •Свойства потока
- •Потоки Windows в clr
- •К вопросу об эффективном использовании потоков
- •Пул потоков в clr
- •Ограничение числа потоков в пуле
- •22. Асинхронные операции в среде .Net. Асинхронный вызов делегатов.
- •23. Синхронизация программных потоков в среде .Net. Блокировки.
- •Двойная блокировка
- •Класс ReaderWriterLock
- •Использование объектов ядра Windows в управляемом коде
- •Вызов метода при освобождении одного объекта ядра
- •24. Синхронизация программных потоков в среде .Net. Атомарные (Interlocked-операции). Семейство lnterlocked-методов
- •25. Прерывание программных потоков в среде .Net. Особенности исключительной ситуации класса ThreadAbortException.
- •26. Мониторы в среде .Net. Ожидание выполнения условий с помощью методов Wait и Pulse. Класс Monitor и блоки синхронизации
- •«Отличная» идея
- •Реализация «отличной» идеи
- •Использование класса Monitor для управления блоком синхронизации
- •Способ синхронизации, предлагаемый Microsoft
- •Упрощение кода c# при помощи оператора lock
- •Способ синхронизации статических членов, предлагаемый Microsoft
- •Почему же «отличная» идея оказалась такой неудачной
- •Целостность памяти, временный доступ к памяти и volatile-поля
- •Временная запись и чтение
- •Поддержка volatile-полей в с#
- •27. Асинхронный вызов делегатов.
- •Общие типы (Generics)
- •Инфраструктура обобщений
- •Открытые и закрытые типы
- •Обобщенные типы и наследование
- •Проблемы с идентификацией и тождеством обобщенных типов
- •«Распухание» кода
- •Обобщенные интерфейсы
- •Обобщенные делегаты
- •Обобщенные методы
- •Логический вывод обобщенных методов и типов
- •Обобщения и другие члены
- •Верификация и ограничения
- •Основные ограничения
- •Дополнительные ограничения
- •Ограничения конструктора
- •Другие вопросы верификации
- •Приведение переменной обобщенного типа
- •Присвоение переменной обобщенного типа значения по умолчанию
- •Сравнение переменной обобщенного типа с null
- •Сравнение двух переменных обобщенного типа
- •Использование переменных обобщенного типа в качестве операндов
- •Преимущества использования общих типов
- •29. Итераторы в среде .Net. Создание и использование итераторов.
- •Общие сведения о итераторах
Безопасные точки
Названия этих методов говорят сами за себя, однако концепция безопасных точек может оказаться новой для пользователя. Безопасные точки располагаются в тех местах кода, в которых среда CLR может безопасно выполнить автоматическую сборку мусора — процесс уничтожения неиспользуемых переменных и освобождения памяти. При вызове методов потока AbortилиSuspendсреда CLR анализирует код и определяет подходящее место для остановки потока.
Свойства потока
Свойство |
Значение |
IsAlive |
Содержит значение True, если поток активен. |
IsBackground |
Возвращает или задает логическое значение, которое указывает, является ли поток (должен ли являться) фоновым потоком.Фоновые потоки отличаются от основного потока лишь тем, что они не влияют на завершение процесса.Когда обработка всех основных потоков закончена, общеязыковая среда выполнения завершает процесс, применяя метод Abortк тем фоновым потокам, которые еще продолжают существовать. |
Name |
Возвращает или задает имя потока.Наиболее часто используется для обнаружения отдельных потоков при отладке. |
Priority |
Возвращает или задает значение, используемое операционной системой для установки приоритетов потоков. |
ApartmentState |
Возвращает или задает потоковую модель для конкретного потока.Потоковые модели важны, когда поток вызывает неуправляемый код. |
ThreadState |
Содержит значение, описывающее состояние или состояния потока. |
Приоритеты потоков
Каждый поток имеет приоритетное свойство, которое определяет, какую часть процессорного времени он должен занять при выполнении. Операционная система выделяет более длинные отрезки времени на потоки с высоким приоритетом и более короткие на потоки с низким приоритетом. Новые потоки создаются со значением Normal, но можно изменить свойствоPriorityна любое значение в перечисленииThreadPriority.
Основные и фоновые потоки
Основной поток выполняется бесконечно, тогда как фоновый поток останавливается сразу после остановки последнего основного потока. Для определения или изменения фонового статуса потока можно использовать свойство IsBackground.
Потоки Windows в clr
Волокно (fiber) — это облегченный поток, состоящий из стека и контекста (набора процессорных регистров). Windows ничего не знает о волокнах. Волокно может состоять из нескольких волокон, а поток одновременно может выполнять только одно волокно. Поток/волокно должен вызвать метод, планирующий выполнение другого волокна в потоке, потому что Windows не работает с волокнами и не умеет планировать их выполнение.
Начну с рассказа об организации потоков и ее отношении к общеязыковой среде CLR. CLR использует реализованные в Windows механизмы организации потоков, и в этой главе я сосредоточусь на том, как они представлены для разработчиков, пишущих код для CLR.
Все же, за CLR остается право отказаться от потоков Windows, и в некоторых сценариях хостинга нарушается четкое однозначное соответствие между CLR- и Windows-потоками. Например, хост диктует CLR представлять каждый CLR-поток как Windows-волокно. Возможно, в следующей версии CLR будет всегда использоваться имеющийся поток, даже при явном запросе создания нового потока. Кроме того, она сможет выявлять потоки, находящиеся в состоянии ожидания, и переназначать их для выполнения других задач. Текущие версии CLR пока на это не способны. Но у Microsoft на этот счет есть немало идей, и, скорее всего, подобные возможности будут реализованы в следующих версиях CLR, что позволит повысить производительность путем уменьшения использования ресурсов ОС. Для разработчика это значит, что при работе с потоками в коде должно быть как можно меньше допущений. Например, нужно как можно реже вызывать «родные» функции Windows, потому что они ничего не знают о CLR-потоках, а также использовать типы из FCL. Такой подход позволит легко реализовать преимущества улучшенной производительности последующих версий CLR.
При выполнении программы на хосте (например, Microsoft SQL Server 2005) поток может сообщить хосту, что для выполнения кода ему нужно использовать текущий физический поток операционной системы, вызвав статический метод BeginThreadAffinity объекта System.Threading.Thread. Когда для работы потока физический поток операционной системы больше не требуется, поток может уведомить хост, вызвав статический метод EndThreadAffinity объекта Thread.