Роль делегата AsyncCallback

Роль делегата AsyncCallback

Вместо того чтобы выяснять у делегата, завершился ли асинхронный вызов метода, лучше позволить делегату информировать поток вызова о выполнении задания. Чтобы реализовать такое поведение, вы должны предъявить экземпляр делегата System.AsyncCallback методу BeginInvoke() в виде параметра, значением которого до сих пор было у нас значение null. Если вы укажете AsyncCallback, делегат вызовет соответствующий метод автоматически, когда асинхронный вызов завершится.

Подобно любому другому делегату, AsyncCallback может вызывать только методы, соответствующие конкретному шаблону, и в данном случае это методы, принимающие единственный параметр типа IAsyncResult и возвращающие void.

void MyAsyncCallbackMethod(IAsyncResult iftAR)

Предположим, что у нас есть другое приложение, использующее делегат BinaryOp. На этот раз мы не будем "просить" делегат выяснить, завершился ли метод Add(). Вместо этого мы определим статический метод с именем AddComplete(), чтобы получить извещение о завершении асинхронного вызова,

namespace AsyncCallbackDelegate {

 public delegate int BinaryOp(int x, int y);

 class Program {

  static void Main(string[] args) {

   Console.WriteLine("*** Пример делегата AsyncCallback ***");

   Console.WriteLine("Вызван Main() в потоке {0}", Thread.CurrentThread.GetHashCode());

   BinaryOp b = new BinaryOp(Add);

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

   // Здесь выполняется другая работа…

   Console.ReadLine();

  }

  static void AddComplete(IAsyncResult iftAR) {

   Console.WriteLine("Вызван AddComplete() в потоке {0}", Thread.CurrentThread.GetHashCode());

   Console.WriteLine("Ваше сложение выполнено");

  }

  static int Add(int x, int y) {

   Console.WriteLine("Вызван Add() в потоке {0}.", Thread.CurrentThread.GetHashCode());

   Thread.Sleep(5000);

   return x + y;

  }

 }

}

Снова заметим, что статический метод AddComplete() будет вызван делегатом AsyncCallback тогда, когда завершится вызов метода Add(). Выполнение этой программы может подтвердить, что именно вторичный поток выполняет обратный вызов AddComplete() (рис. 14.3).

Рис. 14.3. Делегат AsyncCallback в действии

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

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

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

Роль технологий

Из книги Все под контролем: Кто и как следит за тобой автора Гарфинкель Симеон

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


Роль правительства

Из книги Как справиться с компьютерной зависимостью автора Краснова С В

Роль правительства После всего того, что мы слышали о Большом Брате, можем ли мы думать о правительстве иначе, чем как о враге приватности? Несмотря на то что федеральные законы и деятельность государственных органов часто вредят приватности, я уверен, что наши лучшие


Компьютерная роль

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Компьютерная роль Следующий механизм формирования компьютерной зависимости — это принятие роли. В основе этого механизма лежит потребность в игре как таковой, которая свойственна человеку. Для ребенка характерно стремление к принятию роли компьютерного персонажа,


Тип делегата .NET

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Тип делегата .NET Перед тем как дать формальное определение делегата .NET, давайте обсудим соответствующие перспективы. В Windows API для создания объектов, называемых функциями обратного вызова, предполагается использовать указатели функций (подобные указателям C). Используя


Определение делегата в C#

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

Определение делегата в C# Чтобы создать делегат в C#, вы должны использовать ключевое слово delegate. Имя делегата может быть любым. Однако делегат должен соответствовать методу, на который этот делегат будет указывать. Предположим, например, что нам нужно создать делегат с


Простейший пример делегата

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

Простейший пример делегата В начале освоения приемов работы с делегатами у программиста может возникать много вопросов. Поэтому мы начнем с рассмотрения очень простого примера, в котором используется созданный нами тип делегата BinaryOp. Вот программный код, который мы


Исследование объекта делегата

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

Исследование объекта делегата Добавим в имеющийся пример вспомогательную функцию с именем DisplayDelegateInfo(). Она будет выводить имена методов, поддерживаемых поступающим типом, производным от System.Delegate, а также имя класса, определяющего метод. Для этого мы выполним цикл по


Более совершенный пример делегата

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

Более совершенный пример делегата Чтобы продемонстрировать более интересные варианты использования делегатов, мы добавим в класс Car пару членов-переменных логического типа. Первый из добавляемых членов предназначен для индикации того, что автомобиль необходимо помыть


Роль директив CIL

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

Роль директив CIL Прежде всего, есть множество известных лексем CIL, которые используются для описания полной структуры компоновочного блока .NET. Эти лексемы называются директивами. Директивы CIL используются дли информирования компилятора CIL о том, как определять


Роль атрибутов CIL

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

Роль атрибутов CIL Во многих случаях директивы CIL сами по себе оказываются недостаточно информативными, чтобы дать исчерпывающее определение соответствующего типа .NET или его члена. Поэтому многие директивы CIL сопровождаются различными атрибутами CIL, сообщающими о том,


Роль peverify.exe

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

Роль peverify.exe При создании или модификации компоновочных блоков, в которых используется программный код CIL, всегда целесообразно проверить, будет ли скомпилированный двоичный образ правильно сформирован с точки зрения правил .NET. Для этого можно использовать средство


Роль DataSet

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

Роль DataSet Упрощенно говоря, DataSet является представлением внешних данных в памяти. Более точно, DataSet представляет собой тип класса, поддерживающий три внутренние строго типизованные коллекции (рис. 22.11). Рис. 22.11. "Анатомия" DataSetСвойство Tables объекта DataSet позволяет получить


Роль HTTP

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

Роль HTTP Web-приложения очень сильно отличаются от традиционных приложений для настольных систем. Первым очевидным отличием является то, что любое реальное Web-приложение предполагает использование, как минимум, двух соединенных в сеть, машин (конечно, при разработке


Роль папки Bin

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

Роль папки Bin Позже вы увидите, что Web-страницы ASP.NET в конечном счете компилируются в компоновочный блок .NET. Поэтому не должно быть неожиданностью то, что Web-узлы могут ссылаться на любое число приватных или общедоступных компоновочных блоков, В ASP.NET 2.0 метод указания


Роль классов

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

Роль классов Затратив немного времени на устранение абсурдных, но распространенных и вредных заблуждений, можно вернуться к рассмотрению центральных свойств классов и выяснить, в частности, почему они столь важны в объектной технологии.Для понимания ОО-подхода


Роль типизации

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

Роль типизации Зачем настаивать на явном объявлении типов (первое из двух требований)? Это часть главного вопроса о типизации, которому в этой книге посвящена отдельная лекция (лекция 17). Но уже сейчас можно указать две основные причины, по которым ОО-программа должна быть