WebElektronika

Aszinkron metódushívások a C# nyelvben Callback nélkül

person access_time 2017.05.24.
Folytatjuk a szálkezelésről szóló sorozatunkat, most az aszinkron metódushívásokat tekintjük át, de kitérünk az aszinkron módon meghívott metódus futási állapotának a figyelési lehetőségeire is. Noha aszinkron metódushívást mutatjuk most be, nem foglalkozunk a Callback készítésével, azt a következő részben mutatjuk be.


Indítsuk el a Visual Studio-t, és hozzunk létre egy üres, C# nyelvű projektet (1. ábra). Erre azért lesz szükség, mert a létrejövő sln file-ba (Solution-be) több projektet hozunk létre, és a futtatás előtt fogjuk kiválasztani, hogy melyik projektet indítsuk el.

kep
1. ábra   Egy üres projekt létrehozása
 

Az üres projektbe (nincs is ebben Main() metódus) vegyünk fel egy konzol alkalmazást. Erre több lehetőségünk is van.
Első esetben (2. ábra) kattintsunk jobb egérgombbal a Solution nevére és adjunk hozzá egy új projektet.

kep
2. ábra   Új projekt hozzáadása a Solution-hoz (1. variáció)
 

Használhatunk egy másik módszert is (3. ábra) a projekthozzáadásra az üres Solution-hoz.

kep
3. ábra   Új projekt hozzáadása a Solution-hoz (2. variáció)
 

Ezután a szokásos ablak jelenik meg (4. ábra), válasszuk ki a Console Application-t, illetve adjunk a projektünknet (névterünknek) egy nevet.

kep
4. ábra   Console alkalmazás kiválasztása és elnevezése
 

Másoljuk be a Program.cs file-ba a következő programot, majd jelöljük ki a Solution Explorer-ben, hogy a most létrehozott projektet szeretnénk debug módban futtatni.

class Program
    {
        public delegate int WEdelegalt(int a, int b);

        static int szoroz(int a, int b)
        {
            Console.WriteLine("A szoroz() szál-ID : {0}", Thread.CurrentThread.ManagedThreadId);
            return a * b;
        }

        static void Main(string[] args)
        {
            WEdelegalt wd = szoroz;
            Console.WriteLine("Main-ID : {0}", Thread.CurrentThread.ManagedThreadId);

            Console.WriteLine("Meghívjuk a szoroz() metódust");
            IAsyncResult iar = wd.BeginInvoke(10, 20, null, null);

            Console.WriteLine("Várakozunk.....");

            Console.WriteLine("Eredmény : {0}", wd.EndInvoke(iar));

            Console.ReadLine();
        }
    }

 

A Program osztályban két metódus van, illetve a "WEdelegalt" nevű delegált. Ez a delegált kell nekünk ahhoz, hogy egy metódust aszinkron módon tudjunk meghívni, ugyanis a delegálthasználattal lehetőségünk nyílik a BeginInvoke() és az EndInvoke() metódusok használatára.
A szoroz() metódusban kiírjuk a száljának a számát, illetve elvégezzük a szorzás műveletét.

A Main() metódusban a delegáltnak (wd) átadjuk a szoroz() metódust, majd kiírjuk a Main() metódus száljának a számát.
Ezt követően meghívjuk aszinkron módon a szoroz() metódust a BeginInvoke segítségével. A BeginInvoke()-nak jelen esetben négy paramétere van. Az első két paraméter nem más, mint a szoroz() metódusnak (pontosabban a delegáltnak) a két paramétere. A következő két paraméter jelen esetben "null", de ha használnánk a Callback-et (következő részben lesz róla szó), akkor a harmadik paraméter a Callback nevét tartalmazná, a negyedik pedig az esetlegesen átadandó object-et.

A szoroz() metódus aszinkron meghívása után várakozunk, hiszen az EndInvoke() "megállítja" a programunk futását, várakozva a szoroz() metódus futásának a befejezésére. Amikor ennek a metódusnak a futása befejeződik, a szorzás értékét kiírjuk a konzolra (5. ábra).

kep
5. ábra   Futási eredmény
 

Látható a programunk futtatásánál, hogy a metódus aszinkron  meghívása után várakozunk az EndInvoke() segítségével a szoroz() metódus futásának a befejezésére.

Hogyan tudjuk az aszinkron módon meghívott metódus futásának a befejezését ellenőrizni? Milyen lehetőségeink vannak a várakozáson kívül?

Hozzunk létre ebben a Solution-ben egy másik konzolos projektet (ConsoleSzalak2). Ennek az új projektnek a Program.cs file-jába másoljuk be a következő programot, amelynek a felépítése hasonlít az előző példánkhoz.

Három lehetőségünk van arra, hogy az aszinkron módon meghívott metódus futását megvárjuk, állapotát ellenőrizzük. A mintakódunk tartalmazza mind a három lehetőséget úgy, hogy kettő kikommentelésre került.


Ha érdeklődik a cikk teljes tartalma után, kérjük, lépjen be a WebElektronika oldalára.

     Köszönjük.