niedziela, 11 listopada 2012

async, await - przetwarzanie metody asynchronicznej

Zaczniemy znów od kawałka kodu:

Code:
        public async Task<int> GetDataLengthAsync()
        {
            var client = new HttpClient();
            var taskResult = client.GetStringAsync("http://onet.pl");
            DoSomeStaff();
            var pageContent = await taskResult;

            return pageContent.Length; 
        }

        private void DoSomeStaff()
        {
            Console.WriteLine("Doing something");
        }

Przeanalizujmy w jaki sposób wykonywana jest powyższa metoda:
  1. Następuje wywołanie metody GetDataLengthAsync - np z wywołania zdarzenia Click przycisku
  2. Zostaje utworzony obiekt klasy HttpClient i wywołana na nim metoda GetStringAsync
  3. Metoda GetStringAsync jest metodą blokującą - musi oczekiwać na odpowiedź serwera w celu pobrania kodu źródłowego strony. Metoda ta zwraca w rezultacie Task<string>, który jest następnie przypisywany do zmiennej taskResult.
  4. Ponieważ nie potrzebujemy na ten moment rezultatu ze zmiennej taskResult, kod jest wykonywany dalej i zostaje wywołana asynchroniczna metoda DoSomeStaff(). Metoda ta po wykonaniu powraca do metoday GetDataLengthAsync.
  5. Przechodzimy do sedna metody: metoda chce zwrócić długość łańcucha kodu źródłowego strony. Aby to zrobić, musi otrzymać łańcuch z metody GetStringAsync. Słowo kluczowe await mówi: teraz się zatrzymaj i czekaj na wynik zadania taskResult.
  6. GetStringAsync zwraca rezultat - pamiętajmy, że nie jest to string, a Task<string>. Operator await niejako "wyciąga" rezultat i przypisuje go do zmiennej odpowiedniego typu tj string.
  7. Następuje obliczenie długości i zwrócenie jej do zdarzenia, które wywołało metodę GetDataLengthAsync

Tak wygląda przebieg metody asynchronicznej w nowym .NET. Warto przeanalizować kilka przykładów, aby lepiej zrozumieć cały mechanizm.

Brak komentarzy:

Prześlij komentarz