|
Программирование >> Обработка исключительных ситуаций
класс, получающий делегата и результаты public class PNum private int Number; public PNum( int number ) { Number = number; } [OneWayAttributeO] метод, получающий результаты public void Res( IAsyncResult ar ) int ml, m2; получение делегата из AsyncResult AsyncDelegate ad = (AsyncDelegate)((AsyncResult)ar).AsyncDelegate; получение результатов выполнения метода Factorize ad.EndInvoke( out ml, out m2, ar ); Если метод обратного вызова не был указан в параметрах метода Beginlnvoke, метод End Invoke можно использовать в потоке, инициировавшем запрос. В листинге 10.11 приводятся два примера асинхронного вызова метода, выполняющего разложение числа на множители. Листинг приводится по документации Visual Studio с некоторыми изменениями. Класс Factorizer содержит метод Factorize, выполняющий разложение на множители. Этот метод асинхронно вызывается двумя способами: в методе Numl метод обратного вызова задается в Beginlnvoke, в методе Num2 имеют место ожидание завершения потока и непосредственный вызов End Invoke. Листинг 10.11. Асинхронные делегаты using System: using System.Threading; using System.Runtime.Remoting.Messaging; асинхронный делегат public delegate bool AsyncDelegate ( int Num. out int ml, out int m2 ); класс, выполняющий разложение числа на множители public class Factorizer public bool FactorizeC int Num. out int ml, out int m2 ) ml = 1; m2 = Num; for ( int i = 2; i < Num; i++ ) if ( 0 == (Num % i) ) { ml = i; m2 = Num / i; break; } if (1 == ml ) return false; else return true; Листинг 10.11 (продолжение) II вывод результатов Console.WriteLineC Первый способ : множители {0} : {1} {2} , Number, ml. m2 ); демонстрационный класс public class Simple способ 1: используется функция обратного вызова public void NumlO Factorizer f = new FactorizerO; AsyncDelegate ad = new AsyncDelegate ( f.Factorize ); int Num = 1000589023, tmp; создание экземпляра класса, который будет вызван после завершения работы метода Factorize PNum n = new PNum( Num ); задание делегата метода обратного вызова AsyncCallback callback = new AsyncCallbackC n.Res ): асинхронный вызов метода Factorize IAsyncResult ar = ad.BeginlnvokeC Num, out tmp, out tmp, callback, null ); здесь - выполнение неких дальнейших действий ... способ 2: используется ожидание окончания выполнения public void Num2() Factorizer f = new FactorizerO; AsyncDelegate ad = new AsyncDelegate ( f.Factorize ): int Num = 1000589023. tmp; создание экземпляра класса, который будет вызван после завершения работы метода Factorize PNum n = new PNum( Num ); задание делегата метода обратного вызова AsyncCallback callback = new AsyncCallbackC n.Res ); асинхронный вызов метода Factorize IAsyncResult ar = ad.BeginlnvokeC Num, out tmp, out tmp, null, null ); ожидание завершения ar.AsyncWaitHandle.WaitOne( 100.00. false ); Рекомендации по программированию 245 if ( ar.IsCompleted ) { int ml. m2; получение результатов выполнения метода Factorize ad.Endlnvoket out ml, out m2. ar ); вывод результатов Console.WriteLine( Второй способ : множители {0} : {1} {2} , Num, ml. m2 ); public static void MainO Simple s = new SimpleO; s.NumlO; S.Num2(); Результат работы программы: Первый способ : множители 1000589023 : 7 142941289 Второй способ : множители 1000589023 : 7 142941289 ПРИМЕЧАНИЕ- Атрибут [OneWayAttributeO] помечает метод как не имеющий возвращаемого чения и вгходнгх параметров. Рекомендации по программированию Делегаты широко применяются в библиотеке .NET как самостоятельно, так и для поддержки механизма событий, который имеет важнейшее значение при программировании под Windows. Делегат представляет собой особый вид класса, несколько напоминающий интерфейс, но, в отличие от него, задающий только одну сигнатуру метода. В языке С + + аналогом делегата является указатель на функцию, но он не обладает безопасностью и удобством использования делегата. Благодаря делегатам становится возможной гибкая организация взаимодействия, позволяющая поддерживать согласованное состояние взаимосвязанных объектов. Начиная с версии 2.0, в С# поддерживаются возможности, упрощающие процесс программирования с применением делегатов - неявное создание делегатов при регистрации обработчиков событий и анонимные обработчики. Основной целью создания многопоточных приложений является повышение общей производительности программы. Однако разработка многопоточных приложений сложнее, поскольку при этом возникают проблемы синхронизации данных, связанные с потенциальной возможностью доступа к одним и тем же данным со стороны нескольких потоков.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |