- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Интернет-журнал 'Домашняя лаборатория', 2007 №6 - Вязовский
Шрифт:
Интервал:
Закладка:
Инициализация состоит из следующих шагов:
• Создается экземпляр _asyncWorkEvent события AutoResetEvent
Данное событие будет использовано для уведомления системы о том, что очередной рабочий поток из пула потоков может выполнить очередной вызов, сохраненный в очереди вызовов (см. следующий пункт). Начальное состояние данного события не равно signaled, и для уведомления системы это событие надо перевести в состояние signaled (после чего оно автоматически вернется в исходное состояние).
• Создается экземпляр _workItemQueue очереди Queue
Поддержание этой очереди — основная задача свойства синхронизации. Как правило, внешние вызовы, приходящие к объектам некоторого домена синхронизации, преобразуются в специальную форму — так называемую работу, и сохраняются в данной очереди (в некоторых случаях вызов не сохраняется в очереди и выполняется сразу же). Очередная работа извлекается из этой очереди и выполняется при готовности системы выполнять новую работу.
• Создается список _asyncLcidList
Данный список будет использоваться для хранения идентификаторов логических вызовов для асинхронных вызовов, исходящих из данного домена синхронизации. Подробнее это будет обсуждаться далее.
• Создается делегат callBackDelegate типа WaitOrTimerCallBack
Этот делегат хранит ссылку на функцию DispatcherCallBack, которая и будет обрабатывать вызовы, извлекаемые из очереди вызовов.
• Регистрация делегата callBackDelegate и события _asyncWorkEvent в пуле рабочих потоков
Для регистрации используется статический метод RegisterWaitForsingieObject класса ThreadPool. Третий параметр в вызове данного метода равен null, что говорит о том, что функции DispatcherCallBack не передаются никакие данные. Величина интервала ожидания timeout, по истечении которого автоматически вызывается делегат (если ранее состояние _asyncWorkEvent не было переведено в состояние signaled), задается при инициализации атрибута синхронизации и доступна только для чтения:
• private static readonly UInt32 _timeOut = (UInt32)0x7fffffff;
Последний параметр в вызове метода RegisterWaitForSingleObject равен false, что означает, что данная регистрация сохраняется до момента уничтожения самого свойства синхронизации.
Обработка вызова, извлекаемого из очереди вызовов
Прежде всего рассмотрим класс internal class Workltem {….. } экземпляры которого используются для хранения информации о вызовах в очереди вызовов.
Представление вызова в виде работы — экземпляра класса WorkItem
Каждый вызов представляется экземпляром класса WorkItem, в котором необходимая информация задается следующими полями:
• internal IMessage _reqMsg
Это поле хранит ссылку на объект, представляющий собственно вызов в форме сообщения. Именно в этой форме вызов передается между контекстами клиента и сервера. Соответствующий класс должен реализовать интерфейс message.
• internal IMessageSink _nextSink
Вызов попадает в контекст, пройдя некоторую цепочку перехватчиков. Перехватчик, ассоциированный со свойством синхронизации, отправляет вызов в очередь вызовов (если его нельзя выполнить сразу же). Вся семантика свойства синхронизации связана с поддержкой этой очереди. Отстояв свое время в этой очереди, вызов должен продолжить свой путь через цепочку перехватчиков. Данное поле _nextSink хранит ссылку на следующий передатчик, которому должен быть передан вызов. Интерфейс IMessageSink должен быть реализован каждым перехватчиком.
• internal IMessageSink _replySink
Вызовы разделяются на два типа: синхронные и асинхронные. В случае синхронного вызова вызывающая сторона блокируется до получения ответа, в асинхронном случае такая блокировка не выполняется. Однако, в асинхронном случае может оказаться необходимым как-то обеспечить уведомление вызывающей стороны о завершении вызова и о его результатах. В данном случае в вызов включается ссылка _replySink на специальный перехватчик, которому система должна передать уведомление. В случае синхронного вызова значение данного поля равно null.
• internal IMessage _replyMsg
В случае синхронного вызова результат отправляется вызывающей стороне опять же в форме сообщения. Данное поле будет хранить ссылку на это сообщение по завершении вызова.
• internal Context _ctx
Домен синхронизации может состоять из нескольких контекстов, и только один из них содержит свойство синхронизации данного домена. С каждым контекстом связана своя цепочка перехватчиков. В каждой такой цепочке имеется перехватчик, ассоциированный со свойством синхронизации. Вызов, перемещающийся по некоторой цепочке перехватчиков в некоторый контекст, прерывает свое путешествие в перехватчике, ассоциированном со свойством синхронизации, и отправляется в очередь вызовов в виде работы — экземпляра класса WorkItеm. Эта очередь поддерживается в свойстве синхронизации данного домена, которое может размещаться совсем не в том контексте, куда первоначально направлялся вызов. Поле _ctx используется для хранения информации о первоначальном контексте, в котором должен выполняться данный вызов после его освобождения из очереди.
• internal LogicalCallContext _callCtx
Условия выполнения вызова определяются не только контекстом, в котором он должен выполняться, но и контекстом логического вызова, сопровождающим данный вызов. Подробнее это понятие будет объяснено далее. Поле _callctx хранит ссылку на контекст логического вызова для данного вызова.
Немного про асинхронные вызовы
При разборе кода атрибута синхронизации нам придется часто упоминать такое понятие как асинхронный вызов. Уместно сделать отступление и разобрать код, демонстрирующий работу с асинхронными вызовами.
Рассмотрим следующую ситуацию. Сервер предоставляет услуги по проведению сложных математических вычислений, требующих значительных временных затрат.
При использовании синхронных вызовов клиент должен был бы последовательно вызывать необходимые методы. При этом при каждом синхронном вызове клиент блокируется до получения ответа, что не дает ему возможность вызывать методы сервера параллельно и выполнять какую-либо другую полезную работу во время ожидания результатов от сервера.
При использовании асинхронных вызовов клиент может вызывать методы сервера параллельно и в процессе ожидания выполнять дополнительную работу.
В данном случае услуги, предоставляемые сервером, сводятся к выполнению двух арифметических операций (сложение и умножение на 2). Работа, которую клиент выполняет в ожидании ответов от сервера, состоит в выводе на консоль отметок о завершении очередного 100 mс временного интервала.
using System;
using System.Threading;
using System.Runtime.Remoting;
public class Server {
public static bool Sum(int x, int y, out int z) {
Console.WriteLine(
"Server (Sum method) thread = " +
Thread.CurrentThread.GetHashCode()+
"; PoolThread = "+
Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(1000);
z = 0;
try {
z = checked((int)(x + y));
}
catch (Exception) {
return false;
}
return true;
}
public static bool MultBy2(int x, out int y) {
Console.WriteLine {
"Server (MultBy2 method) thread = " +
Thread.CurrentThread.GetHasheode()+
"; PoolThread = "+
Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(1000);
y = 0;

