Синхронизация вызывающего потока

Синхронизация вызывающего потока

Для текущей реализации Main() диапазон времени между вызовом BeginInvoke() и вызовом EndInvoke() явно меньше пяти секунд. Поэтому после вывода на консоль сообщения "В Main() еще есть работа!" поток вызова блокируется и ждет завершения существования вторичного потока, который должен получить результат метода Add(). Таким образом, вы на самом деле выполняете еще один синхронный вызов.

static void Main (string[] args) {

 …

 BinaryOp b = new BinaryOp(Add);

 IAsyncResult iftAR = b.BeginInvoke(10, 10, null, null);

 // До этого вызова проходит менее 5 секунд!

 Console.WriteLine("В Main() еще есть работа!");

 // Вызывающий поток блокируется до завершения EndInvoke().

 int answer = b.EndInvoke(iftAR);

 …

}

Очевидно, что асинхронные делегаты теряют свою привлекательность, если поток вызова может при определенных условиях блокироваться. Чтобы позволить вызывающему потоку выяснить, закончил ли асинхронно вызванный метод свою работу, интерфейс IAsyncResult предлагает свойство IsCompleted. Используя этот член, поток вызова может перед вызовом EndInvoke() проверить, завершен ли асинхронный вызов. Если работа метода не завершена, IsCompleted возвращает false (ложь), и поток вызова может продолжать свою работу. Если же IsCompleted возвращает true (истина), то поток вызова может получить результат "наименее блокирующим" способом. Рассмотрите следующую модификацию метода Main().

static void Main (string[] args) {

 …

 BinaryOp b = new BinaryOp(Add);

 IAsyncResult iftAR = b.BeginInvoke(10, 10, null, null);

 // Это сообщение будет печататься до тех пор, // пока не завершится вызов метода Add().

 while (!iftAR.isCompleted) Console. WriteLine("В Main() еще есть работа!");

 // Теперь мы знаем, что вызов метода Add() завершен.

 int answer = b.EndInvoke(iftAR);

 …

}

Здесь вводится цикл, который будет продолжать выполнение оператора Console.WriteLine() до тех пор, пока не завершится вторичный поток. Как только это произойдет, вы сможете получить результат метода Add() с уверенностью, что этот метод завершил свою работу.

Вдобавок к свойству IsCompleted интерфейс IAsyncResult предлагает свойство AsyncWaitHandle для построения еще более гибкой логики ожидания. Это свойство возвращает экземпляр WaitHandle, предлагающий метод WaitOne(). Преимущество метода WaitHandle.WaitOne() в том, что вы можете указать максимальное время ожидания. Если указанное время превышено, WaitOne() возвращает false. Рассмотрите следующий (обновленный) вариант цикла while:

while (!iftAR.AsyncWaitHandle.WaitOne(2000, true)) {

 Console.WriteLine("В Main() еще есть работа!");

}

Указанные свойства IAsyncResult и в самом деле обеспечивают возможность синхронизации потока вызова, но этот подход оказывается не самым эффективным. Во многих отношениях свойство IsCompleted подобно назойливому менеджеру (или однокласснику), который постоянно спрашивает: "Уже все сделал?" К счастью, делегаты предлагают целый ряд других (и более действенных) подходов для получения результатов методов, вызываемых асинхронно.

Исходный код. Проект AsyncDelegate размещен в подкаталоге, соответствующем главе 14.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Синхронизация ETag и Last-Modified

Из книги Разгони свой сайт автора Мациевский Николай

Синхронизация ETag и Last-Modified Проблема ETag состоит в том, что обычно они используют атрибуты, специфичные в пределах одного сервера. ETag не совпадут, если браузер загрузит компонент страницы с одного сервера и попробует проверить его с другим сервером (у которого время


1 Синхронизация данных 

Из книги Удаленная работа на компьютере: как работать из дома комфортно и эффективно автора Клименко Роман Александрович

1 Синхронизация данных  Итак, определимся. Вы перспективный работник успевающей компании. Вам необходимо всегда иметь при себе самые последние версии каких-то документов. Вам часто приходится изменять документы, причем на разных компьютерах. И все это вы обязаны делать


ЧАСТЬ 3 СИНХРОНИЗАЦИЯ

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

ЧАСТЬ 3 СИНХРОНИЗАЦИЯ


А.5. Синхронизация потоков: программы

Из книги Системное программирование в среде Windows автора Харт Джонсон М

А.5. Синхронизация потоков: программы Для измерения времени, уходящего на синхронизацию при использовании различных средств, мы создаем некоторое количество потоков (от одного до пяти, согласно табл. А.4 и А.5), каждый из которых увеличивает счетчик в разделяемой памяти


ГЛАВА 8 Синхронизация потоков

Из книги 500 лучших программ для Windows автора Уваров Сергей Сергеевич

ГЛАВА 8 Синхронизация потоков Потоки могут упрощать проектирование и реализацию программ и повышать их производительность, но их использование требует принятия мер по защите разделяемых ресурсов от попыток их изменения одновременно несколькими потоками, а также


Синхронизация куч

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Синхронизация куч В NT для синхронизации доступа к кучам (глава 5) предусмотрены две функции — HeapLock и HeapUnlock. В каждой из этих функций единственным аргументом является дескриптор. Эти функции удобно применять в тех случаях, когда используется флаг HEAP_NO_SERIALIZE, или когда


Синхронизация данных

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Синхронизация данных Последствий большинства операций, приводящих к потере данных (случайное или намеренное удаление, форматирование или выход из строя накопителя), обычно можно избежать с помощью резервного копирования. Однако это не единственная опасность,


13.2. Синхронизация потоков

Из книги Компьютерная обработка звука автора Загуменнов Александр Петрович

13.2. Синхронизация потоков Почему необходима синхронизация? Потому что из-за «чередования» операций доступ к переменным и другим сущностям может осуществляться в порядке, который не удается установить путем чтения исходного текста отдельных потоков. Два и более потоков,


11.2.7. Синхронизация файлов

Из книги Секреты приложений Google автора Балуев Денис

11.2.7. Синхронизация файлов Когда программа пишет данные в файл, обычно они сохраняются в кэше ядра до тех пор, пока оно не выполнит запись на физический носитель (такой как жесткий диск), но ядро возвращает управление программе сразу после того, как данные скопируются в кэш.


25.2.4. Синхронизация базы данных

Из книги Разработка ядра Linux автора Лав Роберт

25.2.4. Синхронизация базы данных qdbm кэширует данные в оперативной памяти для ускорения доступа к базе данных, а ядро Linux кэширует записи на диске, чтобы свести к минимуму задержку между вызовами функции write(). Чтобы база данных, хранящаяся на диске, оставалась согласованной с


Синхронизация

Из книги Ноутбук [секреты эффективного использования] автора Пташинский Владимир

Синхронизация При совместном использовании нескольких различных устройств важно обеспечить их полную синхронизацию. Работа всего оборудования должна опираться на одинаковую информацию о времени, а обслуживающие программы – уметь работать с разнообразными типами


Синхронизация

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Синхронизация Иногда очень сложно отказаться от работы со старыми программами. По разным причинам – многие «прикипели» к интерфейсу любимого электронного календаря, где-то та или иная программа является корпоративным стандартом… Но это совсем не значит, что от


Синхронизация

Из книги автора

Синхронизация Для того чтобы фотографии любого вашего альбома прямо из Picasa появились в Интернете на сервисе Picasa Web Albums, необходимо совершить всего два простых действия. Во-первых, щелкнуть на ссылке «Веб-альбомы» над строкой поиска и ввести данные своей учетной записи


Синхронизация и параллелизм

Из книги автора

Синхронизация и параллелизм Ядро подвержено состояниям конкуренции за ресурсы (race condition). В отличие от однопоточной пользовательской программы, ряд свойств ядра позволяет осуществлять параллельные обращения к ресурсам общего доступа, и поэтому требуется выполнять


Глава 13 Синхронизация данных

Из книги автора

Глава 13 Синхронизация данных • VuBrief• SmartSync ProАктивные пользователи – а к таковым относится большинство владельцев ноутбуков – вынуждены работать более чем с одним компьютером. Нередко даже в одной семье есть несколько компьютеров. Перед многими пользователями также


Синхронизация потоков

Из книги автора

Синхронизация потоков Обычным требованием для многопоточных приложений является синхронизация работы нескольких потоков. Для этого в Qt предусмотрены следующие классы: QMutex, QReadWriteLock, QSemaphore и QWaitCondition.Класс QMutex обеспечивает такую защиту переменной или участка