Делегатларани бажариш учун ёки илгари кўрсатилганидек синхрон, ёки BeginInvoke хамда EndInvoke методлари ёрдамида асинрхрон чақирилиши мумкин.
Делегат BeginInvoke методи ёрдами да чақирилганда бажариш муҳити бажариш учун методнинг алоҳида оқиминри ташкил қилади ва бошқарувни чақиришдан кейинги буйруққа узатади. Бунда бошланғич оқимда ҳисоблашни давом эттириш мумкин.
Агар BeginInvoke метолди билан чақиришда тескари мурожаат методи кўрсатилган бўлса, у холда бу метод оқим якунланганидан кейин ишга тушади. Шунингдек, тескари мурожаат ҳам делегат ёрдамида кўрсатилади ва бунда стандарт делегат AsyncCallback дан фойдаланилади. Тескари мурожаатда қайтариладиган қийматлар хамда чиқувчи параметрларни олиш учун EndInvoke методи қўлланилади.
Агар тескари мурожаат методи BeginInvoke методи парамтерларида кўрсатилмаган бўлса, у холда EndInvoke методидан сўровнома ташкил қилган оқимда фойдаланиш мумкин.
25.8-листингда сонни кўпайтувчиларга ажратувчи методни асинхрон чақирувчи иккита намуна келтирилади. Листингда Visual Studio ҳужжатларида келтирилган намунани бир оз ўзгартирилади.
Factorizer методи ўз ичигасонни кўпайтувчиларга ажратувчи Factorize методини олади. Бу метод асинхрон равишда икки хил усул билан чақирилмоқда: Num1 методида тескари мурожаат методи BeginInvoke да кўрсатилади, Num2 методда эса оқимнри тугашини кутилади ва бевосита EndInvoke методи чақирилади. .
25.8-листинг. Асинхрон делегатлар
using System;
using System.Threading;
using System.Runtime.Remoting.Messaging; // асинхрон делегат
public delegate bool AsyncDelegate ( int Num, out int m1, out int m2 );
//сонни кўпайтувчиларга ажратувчи клас
public class Factorizer
{
public bool Factorize( int Num, out int m1, out int m2 )
{
m1 = 1; m2 = Num;
for ( int i = 2; i < Num; i++ )
if ( 0 == (Num % i) ) { m1 = i; m2 = Num / i; break; }
if (1 == m1 ) return false;
else return true;
}
}
// делегар ва натижаларни олучи класс
public class PNum
{
private int Number;
public PNum( int number ) { Number = number; }
[OneWayAttribute()]
//натижаларни олувчи метод
public void Res( IAsyncResult ar )
{
int m1, m2;
// делегатни AsyncResult дан олиш
AsyncDelegate ad = (AsyncDelegate)((AsyncResult)ar).AsyncDelegate;
// Factorize методи натижасини олиш
ad.EndInvoke( out m1, out m2, ar );
// натижаларни чиқариш
Console.WriteLine( "Биринчи усул :кўпайтувчилар {0} : {1} {2}",
Number, m1, m2 );
}
}
// демонстрацион класс
public class Simple
{
// 1-усул: тескари мурожаат функцияси қўлланилмоқда
public void Num1()
{
Factorizer f = new Factorizer();
AsyncDelegate ad = new AsyncDelegate ( f.Factorize );
int Num = 1000589023, tmp;
// Factorize методи иши тугаганидан кейин чақириладиган класс экземпляри
PNum n = new PNum( Num );
// тескари мурожаат методи делегатини кўрсатиш
AsyncCallback callback = new AsyncCallback( n.Res );
// Factorize методини асинхрон чақириш
IAsyncResult ar = ad.BeginInvoke(
Num, out tmp, out tmp, callback, null );
//
// бу ерда қандайдир амаллар бажарилади
// ...
}
// 2-усул: бажарилиш жараёнини тугашини кутиш
public void Num2()
{
Factorizer f = new Factorizer();
AsyncDelegate ad = new AsyncDelegate ( f.Factorize );
int Num = 1000589023, tmp;
// Factorize методи иши тугаганидан кейин чақириладиган класс экземпляри
PNum n = new PNum( Num );
// тескари мурожаатметоди делегатини кўрсатиш AsyncCallback callback = new AsyncCallback( n.Res );
// Factorize методинри асинхрон чақириш
IAsyncResult ar = ad.BeginInvoke(
Num, out tmp, out tmp, null, null );
//тугашини кутиш
ar.AsyncWaitHandle.WaitOne( 10000, false );
if ( ar.IsCompleted )
{
int m1, m2;
// Factorize методи натижаларини олиш
ad.EndInvoke( out m1, out m2, ar );
// натижаларни чиқариш
Console.WriteLine( "Иккинчи усул: кўпайтувчилар {0} : {1} {2}",
Num, m1, m2 );
}
}
public static void Main()
{
Simple s = new Simple();
s.Num1();
s.Num2();
}
}
Дастурнинг натижаси қуйидагича:
Биринчи усул: кўпайтувчилар 1000589023 : 7 142941289
Иккинчи усул: кўпайтувчилар 1000589023 : 7 142941289
Do'stlaringiz bilan baham: |