2013-04-08 21 views
17

Naprawdę walczę z tym. Tworzę aplikację winforms w visual studio i potrzebuję timera tła, który tyka raz na pół godziny - celem tego jest ściągnięcie aktualizacji z serwera.Tworzenie licznika czasu działającego asynchronicznie

Próbowałem kilka różnych podejść, ale nie udało się, albo ze względu na kiepski samouczek/przykłady, albo na moje własne niedociągnięcia w C#. Myślę, że byłoby stratą czasu, aby pokazać wam, co próbowałem, o ile wydaje się, że to, co próbowałem, było dalekie od zera.

Czy ktoś wie o jasnym i prostym sposobie wprowadzania asynchronicznego licznika czasu, który jest łatwy do zrozumienia przez nowicjusza C#?

+2

Zakładam, że używasz 'System.Timers.Timer'? –

+2

Moim zdaniem najważniejsze pytanie brzmi: ile pracy będzie się działo po uruchomieniu timera? Jaki będzie wpływ na repsponsivness twojego programu. Zwróć uwagę, że wszystkie aplikacje WinForm są uruchamiane w jednym wątku UI, jeśli ten wątek stanie się nagle zajęty, pobierając dane z serwera, którym użytkownicy mogą go nie lubić, więc pytania, czy potrzebujesz rozwiązania wielowątkowego, czy nie. – Siraf

+0

To nie jest szczególnie ciężki proces. Po prostu pobiera dane z serwera, a następnie uruchamia SQL w oparciu o zawartość tabeli. Przez większość czasu nic nie zostanie zwrócone. –

Odpowiedz

27
// Create a 30 min timer 
    timer = new System.Timers.Timer(1800000); 

    // Hook up the Elapsed event for the timer. 
    timer.Elapsed += OnTimedEvent; 

    timer.Enabled = true; 


... 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    // do stuff 
} 

ze zwykłymi zastrzeżeniami o: zegar nie będzie niezwykle dokładne i może wymagać GC.KeepAlive(timer)

Zobacz także: Why does a System.Timers.Timer survive GC but not System.Threading.Timer?

+2

To jest najprostszy sposób. +1 –

+0

Mój Boże, to było takie proste! Potrzebne są lepsze przykłady, które można łatwiej znaleźć. Dziękuję Ci! –

+2

Możesz uprościć to dalej: 'timer.Elapsed + = OnTimedEvent;' Możesz utracić część 'new ElapsedEventHandler'. –

4

myślę, że trzeba wiedzieć o wszystkich klas programatora. Zobacz odpowiedź Jona poniżej.

Jakiego rodzaju zegarów używasz?

  1. System.Windows.Forms.Timer będzie wykonywał w wątku UI
  2. System.Timers.Timer wykonuje w wątku wątku basenie chyba określić SynchronizingObject
  3. System.Threading.Timer realizuje swoje wywołanie zwrotne w wątku puli wątków

We wszystkich przypadkach sam zegar będzie asynchroniczny - nie będzie "przejmował" wątku, dopóki się nie uruchomi.

Źródło: Do .NET Timers Run Asynchronously?

+2

-1: odpowiedź jest dosłownym przedrukiem odpowiedzi Jona. Jako taki byłby bardziej odpowiedni jako komentarz. –

+0

Zwykle to prawda, ale o Jenie Skeecie mówimy. +1. –

10

Declare zmienny element w postaci:

System.Timers.Timer theTimer; 

Po załadowaniu formularza (lub cokolwiek innego czasu trzeba, aby rozpocząć aktualizację odpytywanie), wykonaj:

theTimer = new System.Timers.Timer(1800000); 
theTimer.Elapsed += PollUpdates; 
theTimer.Start(); 

Zadeklaruj, że element członkowski PollUpdates działa w następujący sposób:

private void PollUpdates(object sender, EventArgs e) 
{ 
} 
+0

Przepraszam za ewentualny duplikat odpowiedzi od Mitcha Wheera, opublikowałem go w tym samym czasie :) –

+0

Tak, ale dzięki! Niestety, mogę tylko oznaczyć jedną odpowiedź jako zaakceptowaną, a ponieważ Mitch odpowiedział pierwszy, to tylko uczciwie zaznaczam jego. Ale dałem +1 twojemu - dzięki :) –

Powiązane problemy