async i await – višenitno programiranje bez niti II dio


Novine koje dolaze sa C# 5.0 već su postale „lanjski snijeg“, obzirom da je već prošlo 4 mjeseca od pdc10 na kojem je Anders Hejlsberg prezentirao buduću verziju C# 5.0. Pored kompajler kao servis, i još nekoliko novina, prezentiran je novi koncept programiranja nazvan asinhrono programiranje. Šta je asinhrono programiranje i zašto nam može poslužiti, biće prezentirano u nekoliko blog postova.

Teorija iza async i await

Kako smo u prethodnom dijelu napravili uvod u asinhrono programiranje, sada je potrebno definisati nove ključne riječi aync i await koje nam služe da implementiramo asinhronu logiku na način da se direktno ne formiraju niti.

Razlog pojave asinhronog programiranja leži u sve većim zahtjevima koji se postavljaju pred arhitekte i developere, a sastoje se u interakciji sa vanjskim izvorima informacija poput interneta, VPN mrežama i drugim vrstama gdje se reagovanje na zahtjeve može znatno produžiti. S druge strane zahtjevi koji se postavljaju pred dizajnere korisničkog iskustva UX zahtjevaju potpuni ugođaj, odziv u svakom trenutku na korisnikove aktivnostii, te optimizarano vrijeme interakcije korisnik-aplikacija. Pored ovih postoje i drugi zahtjevi poput optimalne iskorištenosti procesorskog vremena u procesiuranju informacija i sl, što je odgovor na razvoj multy-core i many-core procesora. S druge strane, svi ovi zahtjevi posljedica su konstantnog unapredjenja i razvoja hardvera: sve veći razvoj pametnih telefona, tableta, notebooka, interneta društvenih mreža, protoka informacija i korištenja istih.

Microsoft ove zahtjeve i izazove želi riješiti suštinski i ugraditi ih u sami programski jezik što predstavlja pravi dizajnerski podvig. Samim tim što želi imati ovako složenu logiku iza samo dvije ključne riječi async i await .NET programske jezike C# i VB postavlja daleko ispred svojih konkurenata. Asinhrona tehnika programiranja te počinje da se razvija i još puno toga ćemo čuti na račun async i await.

No krenimo ispočetka i pokušajmo vidjeti kako radi koncept asihronog mehanizma preko async i await.

“LongRunnging” operacije ili dijelove koda, koje želimo da nam ne blokiraju UI nit, dekorišemo sa ključnom riječju await. Kako metoda koja je dekorisana sa await treba da vrati objekat tipa Task<T> moguće je nekoliko scenarija, koja će biti definisana kasnije. Metoda koja neposredno poziva “LongRunning” operaciju dekoriše se sa ključnom riječju async, koja upućuje kompajleru da se u tijelu ove metode koriste asinhrone operacije. Sljedeći listing pokazuje primjer korištenja ključnih riječi:

//Svaka metoda sa async označena je kao asinhrona
private async void AsyncOperationSample()
{
    for (int i = 0; i < 100; i++)
    {
        //await- omogućava da se izvrši operacije bez blokiranja UI niti
        await TaskEx.Delay(100);
    }
}

Na koji način gornji primjer radi?
Da bi u potpunosti shvatili gornji listing potrebno se prisjetiti šta je Task u konceptu TPL-a (Task Parallel Library)- novog proširenja u .NET 4.0. Kako je Task asihnhrona operacija koja će u budućnosti da se izvrši i da vrati vrijednost tipa T, tako i cijela linija predstavlja asinhronu operaciju koja može biti tretirana od strane JIT kompajlera na više načina:

  1. Način je da se operacija izvrši trenutno, odnosno da await operator izvrši operaciju bez dodatnog formiranja radne niti.
  2. Način je da je Task neka I/O operacija, koja i u ovom slučaju ne formira dodatnu nit već se izvršava otvarajući IO portove i opet bez dodatnih radnih niti.
  3. Način je da se operacija izvrši formirajući jednu ili više niti zavisno od raspoloživog hardvera, a zašto će se postarati klasa Task, te operaciju završiti na optimalan način uz maksimalno iskorištavanje hardvera.

Iz ovog pregleda vidimo da je asinhrono puno više od samog višenitnog programiranja. Ovaj koncept predstavlja jednistven programski model koji ne zavisi od prirode problema koji se programira. Asinhrono programiranje podrazumijeva korištenje jednog koncepta, koji je vrlo sličan sekvencijalnom programskom modelu, u implementaciji raznih scenarija asinhronog programiranja poput: IO, LAN, WAN i In-Memory i sl.

Primjer korištenja async i await

Windows Forms primjer koji smo implementirali u prethodnom blog postu biće tretiran i ovdje. Međutim, da bi koristili ove osobine C# 5.0, potrebno je skinuti Visual Studio ASYNC CTP koji se nalazi na ovom linku.
sl_asyncbr2
U koliko imate već instaliran SP 1 za Visual Studi 2010 na žalost niste u mogućnosti (bar je to kod mene bio slučaj) da koristite ovaj feature jer nije kompatibilan.

Nakon instalacije koja traje nekoliko minuta, u startnom meniju dobijete novu stavku koja vas upućuje na dokumentaciju i puno demo primjera za async, dovoljno da počnete koristiti ovu tehniku.
Formirajte novi Windows Forms projekat te implementirajte kontrole kao na sljedećoj slici. U biti isto što i u primjeru prethodnog posta, samo bez BackgroundWorker komponente.
sl_asyncbr3
Da bi u novom projektu mogli koristiti async i await potrebno je referencirati AsyncCTPLibrary.dll,  CTP biblioteku koja se nalazi u Samples instaliranom u vašem Document folderu. Na sljedećoj slici se vidi način kako se referencira potrebni dll.
sl_asyncbr1
Demo primjer ćemo implementirati u dvije varijante prvu običnu sekvencijalnu, te drugu asinhronu varijantu.

1. Sekvencijalna varijanta:

Deklarišimo događaje za Run Operation 1 i Cancel Operation dugmad i implementirajmo demo tako da ne znamo ništa oko višenitnog i asinhronog programiranja.


private void operation1_Click(object sender, EventArgs e)
{
    SequentialOperation();
}

bool bCancelOperation = false;

private void SequentialOperation()
{
    operation1Btn.Enabled = false;
    cancelOperation1Btn.Enabled = true;
    for (int i = 0; i <= 100; i++)
    {
        if (bCancelOperation)
        {
            bCancelOperation = false;
            MessageBox.Show("Operation is canceled!");
            break;
        }
        progressBar1.Value = i;
        //
        Thread.Sleep(200);
    }
    operation1Btn.Enabled = true;
    cancelOperation1Btn.Enabled = false;
}

private void cancelOperation1_Click(object sender, EventArgs e)
{
    bCancelOperation = true;
}

Iz listinga vidimo da imamo događaj za pokretanje operacije te samu operaciju koja je simulirana sa metodom Sleep. Kada pokrenemo ovakav demo vidimo da je naš UI potpuno zamrznut, te je irelevantno implementirati Cancel Operation1 dugme jer operaciju ne možemo otkazati niti zatvoriti prozor.

2. Asinhrona varijanta

Na potpuno isti način uz korištenje async i await implemenitiraćemo asinhronu verziju ovog primjera.

private void operation1_Click(object sender, EventArgs e)
{
    AsyncOperationSample();
}
bool bCancelOperation = false;
//This method is sample of async operation
private async void AsyncOperationSample()
{
    operation1Btn.Enabled = false;
    cancelOperation1Btn.Enabled = true;

    for (int i = 0; i <= 100; i++)
    {
        if (bCancelOperation)
        {
            bCancelOperation = false;
            MessageBox.Show("Operation is canceled!");
            break;
        }
        progressBar1.Value = i;
        //await yields control until awaited task completes
        await TaskEx.Delay(100);
    }
    operation1Btn.Enabled = true;
    cancelOperation1Btn.Enabled = false;
}
private void cancelOperation1_Click(object sender, EventArgs e)
{
    bCancelOperation = true;
}

U koliko se shvati šta u biti znači ova tehnika, otvaraju se novi i jednostavniji načini implementacija asinhronih operacija, a dosadašnji kompleksni scenariji postaju više funkcionalni i jednostavniji za održavanje. Source code za ovaj primjer možete sinuti sa ovog linka.

About these ads

About Bahrudin Hrnjica

Senior Software Developer at daenet, Microsoft MVP for C#. Likes C , WPF, Silverlight, WP7, Math, Mechanical Engineering, Evolutionary Algorithms, Blogger.

Posted on 08/04/2011, in .NET, C# and tagged , , , . Bookmark the permalink. 3 Comments.

  1. Get whatever you want to capture showing on your computer screen. Is reading someone’s text messages through software illegal.
    This microphone is normally used in reality or live show as the video will need to have very clear sound for the subject.
    This made a big difference, because otherwise you would have to take a game demo and go in and adjust
    the camera angles of the demo and record them again. If you know a lot concerning old digital cameras and also taking pictures, make a web site to offer taking pictures goods.
    Video marketing has become popular among many business owners because many people enjoy watching videos online.
    While it is not technically a requirement, it may be good to view the entirety of the tape footage
    first before starting to import the footage to the computer so you know that everything
    works fine. By now you’re probably thinking that you don’t need Business Plan just yet.
    They want to see new ideas, new faces, and territory being covered.
    Optimize reimbursement – Automatic cost capture
    with clinical billing and clinical coding accurately paperwork the genuine operate of
    every encounter and avoids unintended downcoding or upcoding.
    In a nutshell, Tiki – LIVE software will allow you to
    record anything from your webcam, capture it, and broadcast it on your website or use
    the embed code and place it anywhere on the internet.
    Graphics Cards possessing Video Capturing Capabilities
    are the third and the newest option. Video download capture can obtain any TV shows, films, music movies and video clips from Dailymotion.
    Along with these great features, Debut Video Capture can be downloaded for free.
    This is an easy to use tool with clear, simply controls.

    VCR allows you to record the video with a Video Cassette
    Recorder (VCR) directly to a VHS tape. The HD2 is much slimmer than the i – Phone,
    measuring in at just 11mm thick, 67mm wide and 121mm high.
    For example, if you intend to connect your VCR to your Home Theater’s computer using a Coax
    Cable, you do not have the option to connect the VCR using RCA cables
    if your capture device only has a coax connection. Conversely,
    while choosing the right management system, the
    complexity terms, features and required IT skills are taken into account,
    apart from the budget. It comes with simple instructions that are easy to follow thus one can work with it alone without having to call in a
    professional. Digital video capture devices can just hardware-capture in DV format.

    If anyone is going to miss the current version as they move to Windows 7, it’ll be the
    dedicated users of MM2. Take actions now, make a You – Tube greeting card yourself.
    Consider it a way to communicate effectively from
    anywhere. is the professional software for Mac users to convert all sorts of
    videos to Kindle Fire Tablet on Mac.

  1. Pingback: Asinhrono programiranje nova proširenja C# 5.0 i narednoj verziji Visual Studia - Blog o C++ i C#

  2. Pingback: Ho to convert your old sequential code in to async « Bahrudin Hrnjica Blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 520 other followers