2011-09-16 9 views
7

Mamy usługę .NET Windows, która przesyła wiele wysoce krytycznych danych od A do B w sposób transakcyjny. Musimy również upewnić się, że wszystkie zewnętrzne komponenty używane w usłudze są nieprzydzielone poprawnie i wszystko zostało wyczyszczone przed wyłączeniem samej usługi. Może to potrwać kilka godzin! Powodem tego jest, że usługa musi czekać na wywołanie zwrotne składnika zewnętrznego, które pojawia się 2, 3 lub 4 godziny później.Czy korzystanie z usługi Windows może trwać godzinami, aby zamknąć się z gracją?

  1. jest to możliwe dla Windows, aby czekać tak długo na służbie zamknięcie wdziękiem?
  2. są opcje w usłudze, gdzie mogę dyktować, co dzieje się, gdy usługa jest zamykana przez system operacyjny, np. zapobiec całkowitemu zamknięciu systemu?
  3. także, jak w innym scenariuszu, co się stanie, jeśli serwer będzie musiał ponownie uruchomić komputer? Czy może czekać godzinami na usługę?
  4. Czy istnieje limit czasu oczekiwania systemu na usługę przed jego zabiciem?
+6

zapomniałeś: 5. Czy istnieje limit na jak długo dana osoba będzie czekać na to maszyna do zamknięcia prawidłowo , przed wyciągnięciem wtyczki? –

Odpowiedz

7

Możesz użyć CanStop, CanShutdown, CanHandlePowerEvent, aby otrzymywać powiadomienia, gdy komputer jest zamykany i odpowiednio reagować.

Użyj metody ServiceBase.RequestAdditionalTime zażądać dodatkowego czasu, aby zakończyć swój wątek:

protected override void OnShutdown() 
{ 
    base.RequestAdditionalTime(MaxTimeout); 
    serviceCore.OnShutdown(); 
    Stop(); 
} 

Jeśli OnShutdown() blokuje dłużej niż 20 sekund (domyślnie zapisywane w rejestrze HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout), twoja usługa zostanie oznaczona jako nie odpowiada i zostanie zabity.

There is a good blog post from the BCL team on that subject that I recommend.

+2

Wywołanie 'RequestAdditionalTime' w obrębie' OnShutdown' spowoduje "InvalidOperationException". –

4

Tak, usługa może zatrzymać blokadę, dopóki się nie zakończy, ale czy powinna? W rejestrze znajdują się wartości limitu czasu, jaki jest system operacyjny?

Myślę, że trzeba odłączyć wywołanie zwrotne od innego komponentu lub dane bufora na dysk i wysłać mniejsze fragmenty. Co dzieje się w powercut? Lub jeśli ktoś ma dość czekania i wyłącza się?

Jeśli dane są krytyczne, zarządzaj nimi poza pamięcią i spraw, by proces mógł zostać ponownie uruchomiony. To rozwiąże twój długotrwały proces zamykania. Podobnie sposób odpytywania komponentu pod kątem postępu eliminuje zależność od blokowania.

+0

Tak, dane są w pewnym sensie krytyczne. Jest to aplikacja na poziomie przedsiębiorstwa, w której ogromne ilości danych są przenoszone, analizowane i indeksowane. Problem polega na tym, że komponent działa wolno. W danym momencie może się zdarzyć nawet 20 000 wywołań zwrotnych, co częściowo jest przyczyną tak długiego czasu oczekiwania. Polling nie jest opcją, ponieważ jego API nie pozwala nam. – John

+0

To pomieszane, z pewnością każde połączenie nie trwa kilka godzin? Czy możesz używać mniejszych partii i rozdzielać połączenia na wiele komputerów? – TheCodeKing

0

Nie można używać RequestAdditionalTime (MaxTimeout) wewnątrz OnShutdown() ...

Powiązane problemy