Showing posts with label delegate. Show all posts
Showing posts with label delegate. Show all posts

Thursday, June 16, 2016

Delegati u C# programskom jeziku



Delegati su neka vrsta pokazivača na metode koji su objektno orjentisani i strogo tipizirani. Najjednostavnije rečeno delegat je referenca na metodu. Najlakše će te ih razumeti ukoliko zamislite da su delegati potpis metoda. Delegati vam omogućavaju da se logika vaše aplikacije u vašim metodama potpuno razdvoji od aplikacija koje su ih pozvale. Inače mnogi programeri ne shvataju zašto bi koristili delegate kad mogu pozvati metodu i ne vide njihovu svrhu. Delegati su predviđeni za situacije u kojima metodama želite da prenosite druge metode. Ja razumem da ste vi navikli da metodama prenosite podatke preko parametara ali ne i metode. Međutim postoje situacije u kojima će vaš metod umesto da za obradu podataka, poziva drugi metod i da bi situacija bila još komplikovanija vi čak i ne znate koji je taj drugi metod koji će se pozivati. Jer to možete znati jedino u fazi izvršavanja i zbog toga je neophodno pozivanje metode preko parametra i zato se koriste delegati.



( Delegati u C# programskom jeziku )

Delegati se često koriste kada radite sa nitima, klasama biblioteka i događajima. Delegate koje nameravate da koristite prvo treba da definišete. To u prevodu znači da vi definisanjem delegata saopštavate kompajleru koju vrstu metoda vaš delegat predstavlja. Svaki delegat se definiše unutar imenskog prostora ili klase. Zatim pravite jedan ili više primeraka tog delegata. Delegati mogu biti i sa i bez parametara. Sintaksa za delegata izgleda ovako; prvo se definiše delegat korišćenjem ključne reči delegate:

public delegate string ImeDelegata(string patrametar);

Delegat se može instancirati ovako:

public ImeDelegata mojDelegat = null;

Delegatu se može dodati referenca koristeći += operator:

mojDelegat += TestMetoda;

ili

mojDelegat = new ImeDelegata(TestMetoda);

Delegatu se takođe može ukloniti referenca koristeći -= operator:

mojDelegat -= TestMetoda;

Sve ovo vam može zvučati i izgledati nerazumljivo ali kad pogledate praktične primere upotrebe delegata, shvatićete koliko je to jednostavno. Ono što je najbitnije treba da razumete da se delegati izvršavaju dinamički; u toku izvršavanja; i da delegat može pokazivati na bilo koju metodu koja ima isti potpis kao i delegat. Pogledajte jednostavan primer kako se koristi delegat sa više metoda.

Primer upotrebe delegata

Friday, May 27, 2016

Asinhrono, async i await višenitno programiranje

Dolaskom C# programskog jezika verzije 5, u C# programski jezik su uključene dve nove ključne reči async i await, dve komande koje ne idu jedna bez druge. Laički rečeno, tamo gde vidite da je metoda definisana sa async, u toj metodi trebate imati i ključnu reč await. Njihova magija je u tome što one omogućavaju višenitno programiranje ali bez direktnog formiranja niti. Sve do pojave asinhronog programiranja, svi vaši .Net programi bez dodatnog programiranja su sve operacije izvršavale sekvencijalno. To u prevodu znači da su se operacije izvršavale jedna po jedna i svaka operacija je morala čekati da se svaka prethodna operacija izvrši do kraja. Kad god napravite aplikaciju poput Windows Form, ona poseduje samo jednu nit; Main thread – glavnu ili UI nit; i sad zamislite da u toj niti koristite I/O operaciju. Vaš Windows će tada čekati dok vi pristupate nekom fajlu na hard disku ili mreži dok god se vaša operacija ne izvrši do kraja. Zbog toga Windows pauzira vašu nit tako da on ne koristi ni jedan CPU resurs ali na taj način zadržava memoriju.


( Asinhronizovano programiranje )

Asinhrono programiranje je jednostavno rešilo ovaj problem, jer asinhrono programiranje za razliku od sekvencijalnog ili sinhronog programiranja vam omogućava da vi pokrenete neku metodu i nastavljate da radite neki drugi posao dok se metoda ne završi. Inače sa sinhronim programiranjem pokrećete neku metodu; morate da čekate da se metoda izvrši do kraja; prosledi vam se neki rezultat i onda se nastavlja vaše izvršavanje programa. Danas se u programiranju koristi i jedna i druga varijanta u zavisnosti da li radite sa I/O operacijama ili jednostavno vam je potrebno više vremena da se izvrši neka metoda. Danas celi koncept Funkcionalnog programiranja je daleko bolji kad se radi preko asinhronizovani delegata, dok na primer UWP ili Phone aplikacija bez asinhroni metoda je nezamisliva jer svaka metoda koja radi duže od 2 sekunde je neprihvatljiva. Asinhrono programiranje se koristi kad imate kompleksne upite koje uzimaju dosta vremena, šaljete email-ove ili radite sa fajlovima. Nadam se da vam je sad jasno koliko je asinhrono programiranje bitno, ali takođe treba da znate da asinhronizovano programiranje nije lako jer se vi morate pobrinuti da ništa ne krene pogrešno, takođe je komplikovano debugovanje i održavanje istog. Ključnu reč async koristite da markirate metodu za asinhronizovanu operaciju. Na taj način vi samo dajete signal vašem kompajleru da će se nešto asinhronizovano desiti. Kompajler tada transformiše vašu kod u programersku C# paradigmu koju zovemo state machine. Znači pokreće sinhronično trenutnu nit, ali vam omogućava da vašu metodu razdvojite u više delova. Kad koristite await ključnu reč, kompajler će generisati kod koji će te videti bez obzira da li je vaša asinhronizovana operacija završena. Ako se vaša metoda samo sinhronizovano nastavlja, u prevodu nije završena; onda će state machine spojiti sa kontinuiranom metodom koja će se pokrenuti kada se task završi. Prepustiće kontrolu pozivajućoj niti i ta nit će se moći koristiti za drugi posao. Imajte u vidu da asinhronizovana metoda može da vrati rezultat samo kao void, Task i Task<T>.

Kako izgleda neki praktični primer asinhronog programiranja?