czwartek, 8 listopada 2012

Asynch await - asynchroniczność w .NET 4.5

Zamrażanie interfejsu użytkownika podczas wykonywania skomplikowanej czynności nie jest dobrym pomysłem. Aplikacja, która "zamiera" nie zachęca do dalszego wykorzystywania przez użytkownika. Programowanie asynchroniczne z drugiej strony wiąże się z większym nakładem pracy oraz bardziej skomplikowanym kodem wynikowym.
Na pomoc przychodzi .NET 4.5 wraz z nowymi słowami kluczowymi: async, await. Jak je stosować i w jaki sposób pomagają nam tworzyć aplikacje asynchroniczne zobaczymy w poniższym przykładzie.

Tworzymy zwykłą aplikację typu Windows Forms. Kładziemy na formatkę kontrolkę Button oraz Label. Oprogramowujemy zdarzenie kliknięcia przycisku:


Code:
        private void button1_Click(object sender, EventArgs e)
        {
            var result = SynchMethod();
            label1.Text = result;
        }

        private string SynchMethod()
        {
            Thread.Sleep(5000);
            return "Done";
        }

Uruchamiamy program, naciskamy przycisk. Jeżeli w tym momencie spróbujemy przesunąć okienko programu nie uda się nam to, aż do czasu pojawienia się na Label-u napisu Done. Dzieje się tak dlatego, ponieważ główny wątek został zamrożony na 5 sekund. Obrazuje to przykładową sytuację pobierania danych z Web Service.
Powyższą metodę w kilku krokach można przerobić z synchronicznej na asynchroniczną dzięki czemu nasz interfejs nie zostanie zamrożony:

Code:
        private async void button1_Click(object sender, EventArgs e)
        {
            var result = await AsynchMethod();
            label1.Text = result;
        }

        private string SynchMethod()
        {
            Thread.Sleep(5000);
            return "Done";
        }

        private Task<string> AsynchMethod()
        {
            var t = new Task<string>(SynchMethod);
            t.Start();

            return t;
        }

Co się tutaj zmieniło?
Dodaliśmy metodę AsynchMethod która zwraca Task<string> czyli tak na prawdę tworzony jest tutaj opakowany wątek  w którym jest wywoływana nasza metoda.
Metoda button1_Click otrzymała słówko kluczowe async oznaczające że metoda ta ma zostać wykonana asynchronicznie.
Metoda AsynchMethod została poprzedzona słówkiem await. Słówko to oznacza zapowiedź tego, iż zostanie zwrócony wynik w nieokreślonej przyszłości. Po jego zwróceniu mają się wykonać kolejne linijki kodu.
Przykład ten jest bardzo prosty - taki miał być w zamiarze. Obrazuje w jaki sposób pisać własne metody asynchroniczne.
Jest to ważne z punktu widzenia pisania aplikacji, które chcemy umieścić w sklepie Microsot. Aby móc sprzedawać w nim swoje aplikacje, należy przejść certyfikację. Jednym z punktów które należy zaliczyć aby otrzymać certyfikat jest ten mówiący o tym, iż każda metoda trwająca powyżej 50 milisekund musi być wywołana w sposób asynchroniczny.

Warto więc już teraz zacząć programować asynchronicznie, aby w późniejszym czasie nie tracić czasu na poprawianie kodu.

2 komentarze: