2015-08-06 19 views
8

Mam dodatek COM dla aplikacji pakietu Office, które wykonuje operację w tle co 30 minut przy użyciu operacjiCo dzieje się z Timerami, gdy komputer budzi się ze snu?

System.Timers.Timer 

tym tle wykonuje uwierzytelnianie użytkowników za pośrednictwem połączenia internetowego, a ja mam raporty z niektórych użytkowników, uwierzytelnianie kończy się niepowodzeniem, gdy ich komputery budzą się ze snu. Nie mogę odtworzyć tego zachowania osobiście, więc moja teoria mówi, że gdy komputer się budzi, operacja w tle jest wykonywana przed przywróceniem połączenia z Internetem (prawdopodobnie połączenie zostało zamknięte przez system Windows, gdy komputer poszedł spać).

Ogólnie rzecz biorąc, jeśli komputer przejdzie w stan spoczynku po okresie bezczynności, co się stanie, gdy komputer się obudzi (w znaczeniu Timers)? Na przykład: Timer został wstrzymany podczas snu, a następnie wznawia się w ustalonych odstępach czasu, gdy komputer się budzi (np. Jeśli Timer było 10 minut przed przerwą, gdy komputer poszedł spać, zdarzenie Timer.Elapsed nie zostanie uruchomione przed upływem 20 min. komputer budzi się)? Czy w kolejce znajduje się zdarzenie Timer.Elapsed, które uruchamia się natychmiast po przebudzeniu komputera? Czy system Windows zatrzymuje komputer Timer, gdy komputer przechodzi w tryb uśpienia? Lub czy komputer Timer nadal działa, gdy komputer śpi, ale ponieważ połączenie internetowe jest zepsute (prawdopodobnie), operacja w tle nie może przeprowadzić uwierzytelniania użytkownika?

+0

Możesz subskrybować zdarzenia zasilania systemu Windows, jeśli jest to przydatne: [Uzyskaj zdarzenia Sleep/Hibernate i Resume/Wakeup w Visual Basic.NET] (http://stackoverflow.com/a/11598083/1115360). –

+0

Czy ten sam problem miałby miejsce, gdyby użytkownik utracił połączenie na minutę przed uruchomieniem timera? –

+1

Twoja aplikacja musi mimo wszystko tolerować utratę połączenia tymczasowego z dużym prawdopodobieństwem. Potrzebujesz czegoś, z czym możesz sobie poradzić, na przykład spróbuj ponownie. – usr

Odpowiedz

-2
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     Console.WriteLine(String.Format("{0}:{1}:{2} : Timer fired", 
      DateTime.Now.ToLocalTime().Hour, 
      "Execute:" + DateTime.Now.ToLocalTime().Minute, 
      DateTime.Now.ToLocalTime().Second)); 
    } 

Po uruchomieniu tego zdarzenia będziesz wiedzieć, czas rozpoczęcia i kiedy chcesz czas wykonania wystarczy przechowywać w miejscu, w którym zarządzasz czasem wykonania. Jeśli komputer przejdzie w stan uśpienia lub hibernacji i zacznie ponownie komputer przed wykonaniem pomiaru czasu, można sprawdzić od ostatniego czasu wykonania i wykonać czynność.