Krótka notatka o Asyns/Await w .NET 4.0

Pisaliśmy kiedyś aplikację dla klienta z dość jaśnie określoną specyfikacją sprzętową. Program ma się bez problemów uruchamiać na 64-bitowym Windowsie 8 ponieważ wszystkie komputery działają pod obsługą tego systemu. Czyli hulaj dusza jedziemy z najnowszą wersją .neta (wszak jest to soft dedykowany dla tego konkretnego klienta). Po czasie określonym w umowie dostarczamy soft klientowi na testy, instalacja przebiega bezproblemowo… do czasu.
Jest godzina 10 spokojnie dopijam czwarty kubek kawy (wszak ograniczam się), gdy dostaje telefon ciut niepokojący.

Wdrożeniowiec: Wojtek kończymy instalację i została nam księgowość i tu jest mały problem.
Ja: Jaki problem?
W: Program się nie uruchamia na XP.
J: Przecież miały być same “ósemki”!
W: Zapomnieli o kilku starych komputerach w księgowości.
J: Noż k$@&%! To jeszcze może mają gdzieś Windowsa 98?
W: W sumie to tak.

W takich momentach opadają ręce i chce się wyć. Na szczęście to nie moje zmartwienie. Informuję przełożoną o zaistniałej sytuacji a ona kontaktuje się z klientem. Z tego co się orientuje to rozmowa była, krótka lecz stanowcza. Tzn. klient wymieni komputery bo taki miał plan, ale nie teraz (bo skończył się mu w tym zakresie budżet). Może za to dopłacić do softu (przesuwając termin oddania projektu). Na pytanie czy jesteśmy w stanie to zrobić odpowiadam, że tak niestety na pytanie na kiedy nie potrafię (to na pewno moja wada – mam problem z oszacowaniem czasu potrzebnego na dane zadanie, ale to chyba kwestia doświadczenia w poprzedniej pracy wszystko co miałem zaplanować było “na wczoraj” a zadania na dany dzień ustalane były na bieżąco).
W .net 4.5 mielibyśmy taką metodę asynchroniczną wywołującą zwykłą metodę

private Task<int> GetNumberAsync()
{
    return Task<int>.Factory.StartNew(()=>GetNumber());
}

później wystarczy gdzieś tą metodę wywołać

private async void DoSomething()
{
    int x=await GetNumberAsync();
    //Do something with x
}

No tylko, że tak łatwo to my mamy w .net 4.5 a tutaj mamy 4.0. Standardowo asynchroniczność w .net 4.0 nie należy do najmilszych rzeczy (jak ktoś nie wierzy to polecam prezentacje Patryka Lenzy na temat asynchroniczności). Nie uśmiechało mi się pisanie wątków i ich obsługa, ale niestety należę do osób, które nie potrafią odmówić. Taki charakter. Inna leniwa część mojego charakteru przypomniała mi, że może jednak da się prościej, a że jestem leniwy to …

Metal, który nie istniał

Nie wiem dlaczego ale Async/Await w .net 4.0 skojarzył mi się z Thorgalem a konkretnie z tomem “Gwiezdne dziecko” i częścią (opowiadaniem?) o nazwie “Metal, który nie istniał”. Gdy rozmawiam z kimś o .net 4.5 jako jedną z największych jego zalet zawsze wymienia się wsparcie dla asynchroniczności(słusznie jak sądzę), ale gdy mówię, że da się to zrobić w .net 4.0 to widzę tylko zdziwienie (politowanie?) na twarzy.
Co więc należy zrobić? Najpierw kwestia formalna jeśli mamy Visual Studio 2010 (lub starsze) to odpuszczamy czytanie tego tekstu gdyż nie jesteśmy w stanie nic zrobić. Gdy już stwierdziliśmy, że nie ma przeszkód formalnych to zaczynamy zabawę. Ustawiamy aby nasz projekt kompilowany był do .net 4.0. Jeśli mieliśmy jakieś wywołania async/await to projekt zaraz zacznie święcić na czerwono. Następnie instalujemy odpowiedni pakiet (a konkretnie Microsoft.Bcl.Async)

Install-Package Microsoft.Bcl.Async

I w zasadzie tyle (ewentualnie poprawiamy wywołania jakiś metod, ale tyle chyba jesteśmy w stanie zrobić dla wygody – ja w każdym bądź razie jestem).

3 thoughts on “Krótka notatka o Asyns/Await w .NET 4.0

  1. Pingback: dotnetomaniak.pl
  2. Mimo wszystko zanim bym usiadł do przeróbek zaproponowałbym bardzo wysoką wycenę (rozumiem że ta praca była osobno fakturowana), może wymiana sprzętu to byłby jednak mniejszy koszt niż przeróbka aplikacji.

    1. I pewnie tak było. Ustalenia biznesowe to nie moja działka. Ja jedynie pilnuje aby zrobić to co klient zamówił (to za co klient zapłacił).

Comments are closed.