2009-03-17 11 views
11

Napisałem HttpModule, który spawns wątek tła. Używam wątku jak Zaplanowane zadanie, które działa w toku, co jest naprawdę przydatne.Jakie są najlepsze praktyki dotyczące zarządzania wątkami tła w usługach IIS?

Jakie są najlepsze praktyki dotyczące śledzenia tego wątku? Nigdy wcześniej tego nie robiłem i jestem nieco zdezorientowany niektórymi aspektami:

  1. Skąd mam wiedzieć, czy wątek nadal działa? Widzę, że wykonuje swoją pracę, ale czy istnieje inny sposób, aby wiedzieć, czy wciąż żyje? Pobrałem ProcMon, ale w3wp.exe spawns boatload z wątków, więc nie miałem pojęcia, który był mój wątek. Nazwałem to, ale to nie pomogło.

  2. Jak "złapać" nitkę, jeśli umrze? Czy istnieje jakaś metoda Dispose, w której mogę ją zapisać do EventLog lub coś, jeśli się nie uda? "Deklaracja śmierci" czy coś takiego?

  3. Jak aktywnie zatrzymać wątek? Jeśli chcę, aby przestał on działać w tle, w jaki sposób mogę go zabić bez konieczności odrzucania usług IIS?

  4. Czy mimo to można go uruchomić ponownie, niezależnie od modułu HttpModule? (Zgaduję, że odpowiedź na to jest nie ...)

Edit: Właśnie w celu wyjaśnienia, intencją jest to, że mój wątek nigdy nie odchodzi. Uruchamia funkcję, po czym przechodzi w stan uśpienia na kilka minut, a następnie budzi się i ponownie uruchamia funkcję. To nie jest tak, że wykonuje jedno zadanie, a potem kończy.

+0

Czy otrzymujesz błąd system.timeout? – TStamper

+0

lekceważenie. to nie powinno się do tego odnosić – TStamper

Odpowiedz

6

Z mojego doświadczenia wynika, że ​​działa to "wystarczająco dobrze", ale nie idealnie. Polecam zaimplementować powtarzające się zadania w usłudze Windows. W zależności od tego, co robią zadania, usługa Windows może nie musi nawet rozmawiać z aplikacją internetową lub odwrotnie, np. sol. jeśli obie działają z tą samą bazą danych. W przeciwnym razie możesz nadal używać e. sol. WCF do komunikacji.

Dużą zaletą jest: Usługa Windows uruchomi się z systemem operacyjnym, możesz łatwo skonfigurować, uruchomić i zatrzymać za pomocą panelu sterowania, masz wbudowane monitorowanie za pomocą dziennika zdarzeń Windows, możesz zaktualizować usługę tła i aplikacja internetowa niezależnie itp.

Jeśli nie jest to opcja, np. sol. ponieważ jesteś we wspólnym środowisku hostingu, polecam następujące:

  1. Rozpocznij wątek tła w aplikacji Application_start (Global.asax) i zapisz odniesienie do wątku w zmiennej statycznej.
  2. Zawiń każdą metodę wywoływaną w wątku w tle za pomocą polecenia try/catch, ponieważ od .NET 2.0 każdy nieobsługiwany wyjątek w wątku tła spowoduje zamknięcie aplikacji. (Zostanie on uruchomiony ponownie przy następnym żądaniu, ale spowalnia następne żądanie, zabija wszystkie obecne sesje i pamięci podręczne, i oczywiście żaden zegar nie będzie aktywny aż do następnego żądania.)
  3. Na każde żądanie (zaimplementowane ma moduł HttpModule lub ponownie w Global.asax), sprawdź instancję Thread w zmiennej globalnej (czy nadal jest! = null, wątek jest aktywny i działa itd.). Jeśli nie, wywołaj kod restartu. Użyj blokady w części restartu, aby upewnić się, że wątek nie zostanie utworzony dwa razy w tym samym czasie.

Nawet wtedy nie można mieć pewności, że wątek w tle jest zawsze uruchomiony, jeśli nie masz stałego ruchu przez całą dobę. Należy również pamiętać, że we wspólnym środowisku hostingowym bardzo często zdarza się, że pule aplikacji są wyłączane, jeśli nie ma aktywności przez kilka godzin. Możesz spróbować to poprawić, konfigurując zaplanowane zadanie na komputerze klienckim w swojej własnej sieci, wykonując co kilka minut lekkie żądanie HTTP w aplikacji, aby upewnić się, że aplikacja jest zawsze uruchomiona.

9

Kiedy Jeff stworzył Stackoverflow, miał podobny problem.

Jego rozwiązaniem było wykorzystanie daty ważności pamięci podręcznej. Wrzuciłbyś coś do pamięci podręcznej, a kiedy wygaśnie, zdarzenie zostanie wywołane w wątku niezwiązanym z użytkownikiem. W obsługi zdarzeń dla wydechu, trzymać jakiś kod, aby ponownie dodać element do pamięci podręcznej i zrobić cokolwiek sprzątanie praca musi być zrobione dla aplikacji

użyciu tej techniki, twoje subquestions są łatwo odpowiedział:

  1. Sprawdzasz, czy element nadal znajduje się w pamięci podręcznej .
  2. Jeśli element nie znajduje się w pamięci podręcznej , dodaj go ponownie.
  3. Usuń element pamięci podręcznej z pamięci podręcznej.
  4. Dodaj element z powrotem do pamięci podręcznej.

Możesz utworzyć małą stronę zarządzania, aby skonfigurować te opcje.

Daje to dobry sposób na zgranie z procesem sprzątania w aplikacji internetowej. Nie wymaga oddzielnej usługi Windows, co jest dużą wygraną.

Powiązane problemy