sobota, 10 listopada 2012

await, async - konwencje i fakty

Nietypowo, na początek trochę 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");
        }

Co czyni powyższą metodę asynchroniczną?
  • sygnatura metody zawiera słowo kluczowe async
  • nazwa metody zawiera przyrostek Async
  • typ zwracany to:
    • Task<TResult>
    • Task
    • void
  • metoda zawiera przynajmniej jedno słowo kluczowe await
.NET 4.5 zawiera wiele metod asynchronicznych i poznać je możemy właśnie po przyrosku Async. 

Fakty związane z async i await:

  • Należy pamiętać że await nie tworzy nowego wątku. Jeżeli chcemy, aby został stworzony nowy wątek można skorzystać z nowej metody Task.Run, która jest skrótem od Task.Factory.StartNew.
  • Jeżeli metoda nie zawiera, żadnego słowa kluczowego await, będzie wykonywana tak jak zwykła metoda synchroniczna. Ze strony kompilatora zostanie zgłoszone jedynie ostrzeżenie o takim fakcie. 
  • Jeżeli metoda zwraca Task dostajemy informację o stanie zadania, rezultat bądź też wyjątek co poszło nie tak podczas wykonywania naszego kodu.
  • Metoda async nie może przyjmować parametrów przekazywanych przez referencję (ref). Może jednak w sobie wywoływać metody, przyjmujące parametry w ten sposób.

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.

Page Inspector

Tworząc aplikację webową, cyklicznie wykonujemy czynność kodowania, a następnie sprawdzania jak wygląda efekt w przeglądarce.
Jeżeli wystąpi błąd najczęściej korzystamy z tzw. narzędzi deweloperskich dostarczanych jako funkcjonalność przeglądarki bądź też plugin (np. FireBug dla Firefox). Cykl ten powtarza się dopóki błąd nie zostanie ostatecznie poprawiony, bądź też żądana funkcjonalność nie osiągnie finalnego wyglądu.
Nowy VS 2012 wprowadza narzędzie Page Inspector, które w zamierzeniu ma zastąpić narzędzia dostępne w przeglądarkach oraz dodać kilka dodatkowych opcji. Dlaczego ma być bardziej innowacyjne od obecnie oferowanych w przeglądarkach? Dzięki Integracji z IDE.
Narzędzie uruchamia się w środowisku VS 2012. Dzięki temu nie opuszczamy ani na chwilę kodu naszej aplikacji.
Wygląd Page Inspector przedstawia poniższy zrzut:






Możliwości narzędzia:

  • narzędzia deweloperskie znane z przeglądarek przeniesione bezpośrednio do okna VS
  • podgląd plików - pokazuje pliki po stronie serwera użyte do renderowania strony
  • manipulacja stylami CSS

poniedziałek, 5 listopada 2012

DOCTYPE w projekcie webowym, oraz testy w wielu przeglądarkach

DOCTYPE - Document Type Declaration - definiuje formalną strukturę dokumentu. Dzięki temu, możemy sprawdzić czy stworzony przez nas dokument jest poprawny pod względem składni. Dla stron HTML wprowadzono kilka standardowych definicji DOCTYPE.
Visual udostępnia automatyczne sprawdzanie składni dokumentu HTML. Do tej pory aby funkcja działała należało wybrać ją z ComboBoxa. W nowym Visualu 2012 wystarczy wpisać odpowiednią deklarację, a odpowiednia wartość zostanie sama wybrana z Comboboxa:






Dodatkowo, bez wymagania żadnej kompilacji, środowisko podpowie, które tagi nie są zgodne z danym DOCTYPE:


Drugim fajnym dodatkiem jest możliwość testów naszej strony pod różnymi przeglądarkami. Aby sprawdzić jak nasza strona wygląda np. pod IE wystarczy wybrać ją z listy:


Visual Studio automatycznie wykryje wszystkie zainstalowane w systemie przeglądarki i doda je do listy pozwalając na szybkie testowanie aplikacji w różnych środowiskach.

Szybkie wyszukiwanie opcji - Quick Launch

Jak często zdarza się, że szukamy jakiejś opcji w IDE i nie możemy znaleźć miejsca w którym się ona znajduje? IDE jakim jest VS przez lata ewolucji rozrosło się do tak dużych rozmiarów, że znalezienie odpowiedniej funkcjonalności może zająć całkiem sporo czasu.
Microsoft zauważył ten problem i w nowym VS 2012 wprowadził Quick Launch, który zaznaczony jest na poniższym screeenie:


W jaki sposób działa nowa wyszukiwarka?
Powiedzmy że chcemy znaleźć miejsce w którym ustawiane są kolory czcionek w IDE. Wpisujemy więc frazę Color a w odpowiedzi otrzymujemy:


Proste, szybkie i skuteczne. Nasza wyszukiwarka przeszukuje oczywiście nie tylko opcje ale także polecenia dostępne w meni. Dla przykładu po wpisaniu intelli otrzymamy następujące podpowiedzi:


Kolejnym ciekawym aspektem jest możliwość wyszukiwania wśród otwartych plików. Zobaczmy na przykład, w projekcie mamy plik Person.cs który jest otwarty na zakładce ale nie aktywny. Wpisujemy nazwę i otrzymujemy podpowiedź:






Funkcjonalność ta nie wyszukuje w zawartości pliku. Szukanie dotyczy tylko i wyłącznie nazwy pliku.

W opcjach


Możemy kolejno:

  • wyłączyć pasek wyszukiwania
  • ostatnio wyszukiwane frazy nie będą kasowane
  • wybrać kategorie które będą obsługiwane przez Quick Launch

Narzędzie bardzo fajne i godne polecenia.

niedziela, 4 listopada 2012

Operacje na zbiorach

Kod źródłowy do pobrania: https://skydrive.live.com/redir?resid=BCCBFB57B3C672D0!117

Biblioteka .NET dostarcza wiele ułatwień w dziedzinie pracy nad zbiorami.
W ramach przypomnienia matematyki:



Do pracy ze zbiorami możemy podejść na dwa sposoby:
  1. Metody LINQ
  2. Kolekcja HashSet<T>
Kiedy wybrać operacje LINQ:
  • takie same wartości w kolekcji są dopuszczalne
  • nie chcemy modyfikować istniejącej kolekcji (źródła) - zwracamy IEnumerable<T>
Kiedy kolekcja HashSet<T>:
  • nie mogą się pojawić te same wartości więcej niż raz
  • chcemy modyfikować oryginalną kolekcję

Metody LINQ:
Concat - sumuje dwa zbiory, dopuszczając do zduplikowanych wartości:

Code:
            int[] set1 = { 1, 2, 3 };
            int[] set2 = { 4, 5, 3 };

            var result = set1.Concat(set2);


Union - sumuje dwa zbiory, jako rezultat zwracając elementy unikalne w obu zbiorach:

Code:
            int[] set1 = { 1, 2, 3 };
            int[] set2 = { 4, 5, 3 };

            var result = set1.Union(set2);


Distinct - zwraca tylko elementy unikalne:

Code:
            int[] set1 = { 1, 2, 3, 3, 4, 5, 3, 2, 1, 4, 5, 6, 7, 4, 5, 6, 3 };

            var result = set1.Distinct();


Expect - różnica - wartości w pierwszym zbiorze, które nie występują w drugim:

Code:
            int[] set1 = { 1, 2, 3 };
            int[] set2 = { 4, 5, 3 };

            var result = set1.Except(set2);


Intersect - przecięcie zbiorów czyli część wspólna:

Code:
            int[] set1 = { 1, 2, 3, 4 ,5 };
            int[] set2 = { 4, 5, 3 };

            var result = set1.Intersect(set2);


Rezultaty operacji:




Kolekcja HashSet<T>
Kolekcja ta została dodana w .NET wersji 3.5 czyli można rzec "dość późno". Jest to kolekcja oparta na kluczach, zawierająca tylko wartości unikalne. Dzięki swojej budowie operacje wyszukiwania, sprawdzania czy dany element już istnieje w kolekcji czy też usuwanie elementu mają złożoność liniową O(1). Operacje wywoływane na kolekcji powodują zmianę oryginalnej kolekcji. Aby odróżnić metody LINQ od HashSet<T> metody kolekcji posiadają słówko With np. UnionWith, IntersectWith:

Code:
            var set1 = new HashSet<int>(new int[] { 1, 2, 3 });
            var set2 = new HashSet<int>(new int[] { 3, 4, 5 });
            set1.UnionWith(set2);




Porównanie metod dla metod LINQ i kolekcji HashSet<T>:


Oczywiście metody które nie występują w LINQ łatwo można dopisać, np. dla operacji SetEquals kod LINQ będzie wyglądać następująco:

Code:
a.Distinct().OrderBy(x => x).SequenceEqual(b.Distinct().OrderBy(y => y));

czwartek, 1 listopada 2012

Chmura prywatna

Chmura prywatna - pojęcie to jest związane ze zwyczajną chmurą obliczeniową.Tak więc oprócz skalowalności, elastyczności oraz samoobsługi otrzymujemy dodatkową kontrolę i personalizację.



Microsoft w ramach prywatnej chmury umożliwia realizowanie dwóch modeli usług:
  • IaaS - infrastruktura jako usługa - korzystanie z zasobów infrastruktury jako usług
  • PaaS - platforma jako usługa - dostęp do konkretnej platformy aplikacji
 Zalety chmury prywatnej:
  • Pule zasobów - zasoby chmury (moc obliczeniowa, pamięć, przepustowość) mogą być dynamicznie przydzielane w zależności od aktualnych potrzeb
  • Samoobsługa - usługi zarówno po stronie klienta jak i usługodawcy są zarządzane poprzez interaktywny portal, który pozwala na automatyczne przydzielanie usług
  • Elastyczność - zasoby z puli mogą być bardzo szybko przydzielane i zmieniane w zależności od aktualnych wymagań usługi. Stają się dzięki temu skalowalne zarówno w górę jak i dół. 
  • Personalizacja i kontrola - zasoby prywatnej chmury przeznaczone są wyłącznie dla wykupującej jej jednostki, dzięki czemu mamy większą kontrolę nad architekturą chmurową oraz szerszą personalizację
Najważniejszą zaletą jednak jest to, iż płacimy za realne wykorzystane zasoby chmury, a nie za elementy których nie wykorzystamy.