Showing posts with label await. Show all posts
Showing posts with label await. Show all posts

Thursday, September 08, 2016

Rad sa tekstualnim i binarnim datotekama u C# programskom jeziku


Zahvaljujući neverovatnom brzom i velikom progresu C# programskog jezika sa svim njegovim novim promenama i mogućnostima; nikada nije bilo lakše raditi sa tekstualnim i binarnim datotekama. Ukoliko niste pročitali dva predhodna poglavlja ( pogledajte u sadržaju ) kako se radi sa direktorijumima i fajlovima, savetujem vam da to uradite pre nego što krenete sa navedenom temom. Za čitanje i pisanje datoteka se koriste više klasa, ali opšti koncept za realizovanje istih nazivamo stream - strim – tok podataka. Tok podataka vam je u suštini serija bajtova koji se kreću od jedne tačke do druge. Tok podataka se može prenositi iz nekog spoljašnjeg izvora u program i tada govorimo o čitanju iz toka podataka ali ako se podaci prenose iz programa u neki spoljašnji izvor data govorimo o pisanju u tok podataka. Uglavnom vas tako u školama uče. Spoljašnji izvor može da bude datoteka, mrežni protokol ili neko područje memorije. Čak i neka promenjiva unutar vašeg programa može da se tretira kao spoljašnji izvor. Bitno je da uvek razmislite gde i kako će vaš program pamtiti podatke koje koristi i pre nego što počnete da programirate program.


( C# programskim jezik pojednostavljuje rad sa tekstualnim i binarinim datotekama )
                                          
Za pisanje i čitanje datoteka, Microsoft vam nudi bazne klase imenskog prostora System.IO kao i System.Net.Sockets za mrežne podatke, ali tri najbitnije klase za ovaj posao definitivno jesu StreamReader i StreamWriter koje su namenjene isključivo za pisanje i čitanje tekstualnih datoteka dok je klasa FileStream služi za čitanje, pisanje ali i pozicioniranje binarnih podataka unutar strima. Druge klase poput BinaryReader-a i BinaryWriter-a pružaju dodatne mogućnosti formatiranja binarnih podataka. Sve ovo teoretski može da zvuči konfuzno, za sve klase uvek trebate da istražujete MSDN i da svaku klasu prostudirate u potpunosti radi vas; ali najbolje će te programiranje naučiti kroz konkretne primere i kod. Podaci mogu da se čuvaju i u drugačijim formatima poput XML-a, o kojima ću posvetiti sledeći post u sekciji sadržaja bloga C# Advanced – Napredni Nivo. Danas se skoro svi podaci uglavnom čuvaju u bazama podataka. Svaki C# programer mora da poznaje i rad sa bazama podataka iako ne mora biti stručnjak za baze podataka. Iz tog razloga pored C# postova, uporedo možete pratiti i SQL postove sa rad sa podacima, jer ako ne naučite baze podataka nećete umeti ni da im pristupate, niti da koristite i skladištite podatke iz vaših programa, sistema i servera.

Upisivanje i čitanje teksta iz tekstualnih fajlova

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?