wrz
14
2012

Komunikacja pomiędzy procesami za pomocą MemoryMappedFile

Czasami zdarza się, że potrzebujemy wymienić jakieś proste informacje pomiędzy procesami a nie chcemy budować całej infrastruktury komunikacyjnej w stylu WCF, socketów itp. Na taką prostą sytuację wymagającą komunikacji interprocesowej ostatnio natrafiłem.Otóż mam sobie aplikację WPF-ową która działa w Tray-u. Okno główne odpala tylko po kliknięciu na Tray-a. Oczywiście chcemy, żeby w danej chwili uruchomiona była tylko jedna instancja takiej aplikacji, więc zrobiłem zabezpieczenie na Mutexie (działa to w ten sposób, że aplikacja próbuje utworzyć nowy obiekt typu Mutex, a w przypadku kiedy już taki istnieje to znaczy że mamy odpaloną inna instancję aplikacji i tę należy zamknąć). I działa to OK, tylko problem w tym że jeśli aplikacja wisi tylko w Tray-u i ktoś klika na ikonkę aplikacji to nic się nie dzieje (nie otwiera nowego okna ani nie pokazuje starego). A chcemy, żeby ten "drugi" proces nim zostanie zamknięty wymusił w jakiś sposób otwarcie głównego okienka należącego do "pierwszego" procesu. Prostym i niezwykle wydajnym rozwiązaniem jest użycie w tym przypadku MemoryMappedFile. Należy on do przestrzeni System.IO i pełni dwie funkcje: Zapewnia "obróbkę" w pamięci bardzo dużych plików Umożliwia dostęp do danego obszaru pamięci wielu procesom Nam chodzi oczywiście o to drugie zastosowanie. W moim przypadku rozwiązanie problemu polega na implementacji dwóch kroków: Ustawienie przez proces "zamykany" wartości w pamięci informującej o konieczności uruchomienia okna aplikacji Sprawdzanie przez główny proces wartości tej pamięci i w przypadku zmiany odpalenia okna [Więcej]
lip
18
2012

Komunikacja dwustronna (duplex) pomiędzy procesami za pomocą WCF

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]
lut
8
2012

Prosty moduł zarządzający konfiguracją

Ostatnio stworzyłem dość prosty i wydaje mi się fajny moduł konfiguracyjny :) Potrafi trzymać np. w bazie danych dowolne obiekty konfiguracyjne, pobierać je i zmieniać jednocześnie dbając o ich unikalność. Całość kodu to jeden interfejs, jedna klasa abstrakcyjna i dwie klasy implementujące :) Zacznijmy od ogólnego zarysu architektury (o ile przy takim prostym rozwiązaniu można mówić o architekturze :)) Za jej całość odpowiada: interfejs IConfigurationProvider oraz klasa abstrakcyjna ConfigObject. Przyjrzyjmy się ich kodow [Więcej]