lip
18
2012
Aby omówić przedstawioną w temacie kwestię opiszę krótko projekt który obecnie realizuję. Otóż jest to prosty system do automatycznej aktualizacji aplikacji. Przez weba można załadować paczkę instalacyjną, natomiast po stronie klienta działa usługa Windows Service mająca za zadanie ściągać tę paczkę i ją zainstalować. Stworzyłem również proste GUI w postaci aplikacji WPF-owej dla klienta, które komunikuje się z usługą po WCFie za pomocą named-pipes. Początkowo zamierzałem wszystkie wywołania zrobić synchronicznie i tak też zacząłem implementację: ściąganie listy aktualizacji i zarządzanie konfiguracją jest zrealizowane przez synchroniczne wywołania realizowane przez specjalnie tworzony do tego BackgroundWorker (żeby nie blokować głównego wątku GUI). Niestety, takie podejście nie sprawdza się w następnym zadaniu które chciałem wykonać, a mianowicie chciałem żeby usługa na bieżąco informowała GUI o postępie wykonywanych zadań. Czyli, żeby na GUI ładnie wyświetlała się lista aktualizacji a przy nich stan: "oczekująca", "w trakcie instalacji" itp. W takim podejściu model synchroniczny "wysiada", bo żeby komunikacja była płynna należałoby co kilkaset milisekund odpytywać usługę o to co się dzieje (tworząc za każdym razem oczywiście osobny wątek do obsługi!) co oczywiście wydajnościowo "nie wydoliłoby". Jednym sensownym rozwiązaniem jest asynchroniczna komunikacja dwustronna - klient zgłasza się, że chce otrzymywać informację od usługi a usługa bezpośrednio komunikuje się z nim tylko w momencie kiedy ma coś ciekawego do powiedzenia. Taka komunikacja jest możliwa w WCF-ie przy zastosowaniu trybu "duplex" i dodatkowo musi być odpowiedni binding (named pipes albo net-tcp). Aby cosik takiego zrealizować należy uskutecznić kilka kroków
[Więcej]