Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №6
Шрифт:

>>> MyCallback thread = 18 IsPoolThread = True

Test 16: Count = 16 timedOut = True

Возвращаемся к коду инициализации атрибута

Теперь можно более подробно обсудить код метода InitIfNecessary. Все тело этого метода включено в критическую секцию lock(this) {}. Здесь this является ссылкой на экземпляр текущего класса (SynchronizationAttribute), который и является собственно

свойством синхронизации (как контекста, так и домена синхронизации). Таким образом, при входе текущего потока в данную критическую секцию никакой другой поток не может войти в эту секцию (и в любую другую типа lock (obj) {}, где obj является ссылкой на данное свойство синхронизации).

Далее проверяется условие _asyncWorkEvent == null. Это условие выполняется только тогда, когда текущее свойство синхронизации еще не инициализовано, т. е. в данный момент формируется новый домен синхронизации и текущее свойство будет его свойством синхронизации. Именно в этом случае выполняется инициализация свойства. В противном случае код инициализации пропускается, т. к. текущее свойство уже инициализирование ранее.

Инициализация состоит из следующих шагов:

• Создается экземпляр _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.

Поделиться:
Популярные книги

…спасай Россию! Десант в прошлое

Махров Алексей
1. Господин из завтра
Фантастика:
альтернативная история
8.96
рейтинг книги
…спасай Россию! Десант в прошлое

Хозяйка покинутой усадьбы

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка покинутой усадьбы

Доктор 2

Афанасьев Семён
2. Доктор
Фантастика:
альтернативная история
5.00
рейтинг книги
Доктор 2

Я тебя верну

Вечная Ольга
2. Сага о подсолнухах
Любовные романы:
современные любовные романы
эро литература
5.50
рейтинг книги
Я тебя верну

Очкарик 3

Афанасьев Семён
3. Очкарик
Фантастика:
фэнтези
5.75
рейтинг книги
Очкарик 3

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия

Архил...? Книга 2

Кожевников Павел
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...? Книга 2

1941: Время кровавых псов

Золотько Александр Карлович
1. Всеволод Залесский
Приключения:
исторические приключения
6.36
рейтинг книги
1941: Время кровавых псов

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Полковник Гуров. Компиляция (сборник)

Макеев Алексей Викторович
Полковник Гуров
Детективы:
криминальные детективы
шпионские детективы
полицейские детективы
боевики
крутой детектив
5.00
рейтинг книги
Полковник Гуров. Компиляция (сборник)

Вечный. Книга IV

Рокотов Алексей
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга IV

Его наследник

Безрукова Елена
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Его наследник

Невеста снежного демона

Ардова Алиса
Зимний бал в академии
Фантастика:
фэнтези
6.80
рейтинг книги
Невеста снежного демона

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги