Программирование >>  Обработка исключительных ситуаций 

1 ... 77 78 79 [ 80 ] 81 82 83 ... 142


класс, получающий делегата и результаты

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, в С# поддерживаются возможности, упрощающие процесс программирования с применением делегатов - неявное создание делегатов при регистрации обработчиков событий и анонимные обработчики.

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



1 ... 77 78 79 [ 80 ] 81 82 83 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика