- •Сравнительная характеристика технологий .Net и Java.
- •Промежуточный язык il и байт-код Java. Сравнительная характеристика.
- •Основные принципы построения архитектуры .Net.
- •Сборки (assembly) в среде .Net. Проблема версионности сборок и ее решение.
- •Общая система типов данных в среде .Net. Размерные и ссылочные типы данных.
- •Модель автоматической утилизации динамической памяти, основанная на сборке мусора. Проблема недетерминизма.
- •Модель автоматической утилизации динамической памяти, основанная на аппаратной поддержке (тегированной памяти).
- •Сборка мусора в среде .Net. Построение графа достижимых объектов.
- •Сборка мусора в среде .Net. Механизм поколений объектов.
- •Завершение объектов в среде .Net. Метод Finalize. Список завершаемых объектов (finalization queue) и очередь завершения (freachable queue).
- •Динамические массивы в среде. Net и языке c#.
- •События в среде .Net; реализация событий посредством делегатов.
- •Исключительные ситуации и реакция на них в среде .Net.
- •Средства многопоточного программирования в среде .Net. Автономные потоки. Пул потоков.
- •Асинхронные операции в среде .Net. Асинхронный вызов делегатов.
- •Синхронизация программных потоков в среде .Net. Блокировки.
- •Синхронизация программных потоков в среде .Net. Атомарные (Interlocked-) операции.
- •Мониторы в среде .Net. Ожидание выполнения условий с помощью методов Wait и Pulse.
- •Асинхронный вызов делегатов.
- •Итераторы в среде .Net. Создание и использование итераторов.
- •Атрибуты в среде .Net и языке c#. Создание своих атрибутов.
- •Сервисно-ориентированная архитектура (соа) и ее принципы.
- •Технология wcf. Создание сервиса и клиента.
- •Взаимодействие управляемого и неуправляемого кода в среде .Net на примере вызова функций Windows api.
-
Асинхронные операции в среде .Net. Асинхронный вызов делегатов.
Чтобы добавить в очередь пула потоков асинхронную вычислительную операцию, обычно вызывают один из следующих методов класса ThreadPool
static Boolean QueueUserWorkItem(WaitCallback callBack);
static Boolean QueueUserWorkItem(WaitCallback callBack, Object state);
static Boolean UnsafeQueueUserWorkItem(WaitCallback callBack, Object state);
Эти методы ставят рабочий элемент (вместе с дополнительными данными состояния) в очередь пула потоков и сразу возвращают управление приложению. Рабочий элемент — это просто указанный в параметре callback метод, который вызывается потоком из пула. Этому методу можно передать один параметр, указанный в параметре state (данные состояния). Версия метода QueueUserWorkltem без параметра state передаст null методу обратного вызова. В конце концов один из потоков пула обработает рабочий элемент, что приведет к вызову указанного метода. Создаваемый метод обратного вызова должен соответствовать типу-делегату System.ThreadingWaitCallback, который определяется так:
delegate void WaitCallback(Object state);
Метод UnsafeQueueUserWorkltem класса ThreadPool очень похож на чаще используемый метод QueueUserWorkItem. Вкратце скажу, чем они различаются. При обращении к ограниченному ресурсу (например, при открытии файла) CLR выполняет проверку доступа к коду (CAS), то есть наличие разрешений на доступ к ресурсу у всех сборок в стеке вызывающего потока. При отсутствии у какой-либо из них нужных разрешений CLR генерирует исключение SecurityException. В частности, это исключение возникнет, когда поток, выполняющий код сборки, у которой нет разрешения на открытие файла, все-таки попытается его открыть.
Чтобы обойти это ограничение, поток может поставить рабочий элемент в очередь пула потоков, тогда код открытия файла будет выполнен потоком из пула. Конечно, все это должно происходить в сборке, имеющей необходимые разрешения. Это «решение» обходит защиту и открывает злоумышленникам доступ к ресурсам с ограниченным доступом. Чтобы устранить эту брешь в защите, метод QueueUserWorkItem просматривает стек вызывающего потока и отслеживает все разрешения на доступ, а затем ассоциирует их с потоком из пула, когда он начинает выполняться. Таким образом, поток из пула работает теми же разрешениями, что и поток, вызвавший метод QueueUserWorkltem.
Просмотр стека потока и отслеживание всех разрешений на доступ заметно снижают производительность. Чтобы улучшить быстродействие постановки в очередь асинхронной вычислительной операции, можно вместо QueueUserWorkItem вызывать метод UnsafeQueueUserWorkltem, который просто ставит элемент в очередь к пулу потоков и не просматривает стек вызывающего потока. В результате этот метод выполняется быстрее, чем QueueUserWorkItem, но создает брешь в защите приложения. Поэтому UnsafeQueueUserWorkltem нужно вызывать, только будучи уверенным, что поток из пула будет выполнять код, не обращающийся к ресурсу с ограниченным доступом, или если обращение к этому ресурсу предусмотрено в приложении. Также учтите, что в коде, вызывающем метод UnsafeQueueUserWorkltem, должны быть установлены флаги ControlPolicy и ControlEvtdence для SecurityPermission — это не позволит ненадежному коду случайно или преднамеренно повысить уровень разрешений.
Асинхронные операции — это ключ к созданию высокопроизводительных, масштабируемых приложений, которые позволяют выполнять много операций, используя очень небольшое число потоков. А вкупе с пулом потоков они дают возможность эффективно задействовать все процессоры в системе. Осознавая этот огромный потенциал, группа разработчиков CLR приступила к созданию модели, которая сделала бы его доступным для всех программистов. Эта модель была названа моделью асинхронного программирования (АРМ).