2012-11-29 8 views
6

Jest to dość prosty problem, ale za każdym razem, gdy próbuję znaleźć odpowiedź, pokazuje on rzeczy o Zaplanowanych zadaniach systemu Windows, a to nie jest to.Planowanie uruchamiania metody o określonej godzinie.

Say mój program jest w zasadzie tak:

void StartDoingThings() 
{ 
    //At Specific System.DateTime 
    DoSomething() 

    //At another specific System.Datetime 
    DoSomethingElse() 
} 

Co mogę umieścić zamiast tych uwag, aby spowodować te metody, aby uruchomić w oddzielnych datetimes.

Mogę używać Thread.Sleep() lub nawet System.Threading.Timers i obliczać interwały na podstawie (DateTimeOfEvent - DateTime.Now), ale czy jest po prostu coś do powiedzenia (zakładając, że program nadal działa): At 9:30:00 dnia 11/30/2012, należy wykonać metodę DoAnotherThing()?

+3

Istnieje szkielet o nazwie quartznet, spójrz na to. http://quartznet.sourceforge.net/ –

+4

Powodem, dla którego nadal widzisz Zaplanowane zadania, jest to, do czego jest przeznaczony. do uruchamiania zadań według harmonogramu. każde zadanie może być odpowiednio zaplanowane według własnego harmonogramu i pozwolić zarządzającemu zaplanować, kiedy wykonać. –

+0

To jest moje zrozumienie (które może być nieprawidłowe), że Harmonogram zadań systemu Windows jest "W X czas, uruchom ten program", a następnie prawdopodobnie zrobić soemthing z tego programu. Nie uruchamiam innego programu, chcę tylko, aby coś wewnątrz mojego obecnego programu czekało do pewnego czasu. Jeśli jestem niepoprawny, zdecydowanie pomóż mi zrozumieć, ale biorąc pod uwagę moje zrozumienie, Harmonogram zadań systemu Windows nie pomógłby mi uruchomić określonej części mojego już działającego programu w określonym czasie. – Xantham

Odpowiedz

4

Jeśli chcesz "zaplanować" metodę zrobienia czegoś we wcześniej określonym czasie, możesz to zrobić na kilka sposobów. Nie użyłbym Thread.Sleep(), ponieważ to wiązałoby wątek nic nie robiąc, co jest marnotrawstwem zasobów.

Powszechną praktyką jest stosowanie metody odpytywania, która budzi się w regularnym harmonogramie (powiedzmy raz na minutę) i przejrzyj udostępnioną listę zadań do wykonania. System.Timer mogą być stosowane do metody odpytywania:

aTimer = new System.Timers.Timer(10000); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

Sposób OnTimedEvent może zawierać kod, który utrzymuje kolekcję „zadania” do wykonania. Kiedy nadejdzie czas zadania, następny bieg Timera spowoduje jego wykonanie.

+0

Więc nie ma nic wbudowanego w to, co zrobiłoby to po prostu przy użyciu obiektu DateTime? To po prostu wydaje się być tak powszechną rzeczą, jak robienie czegoś w określonym Dniu Czasowym byłoby wbudowane. Niektóre zadania w moim programie mogą mieć opóźnienia między nimi do kilku sekund, a nawet do kilku godzin, i oczywiście nakazujące sprawdzenie każdego po drugie pochłonęłoby prawdopodobnie więcej zasobów niż to konieczne. – Xantham

+0

Zakładam, że powodem, dla którego nie jest wbudowany, jest to, że czas systemowy może zostać zmieniony, co prowadzi do niedopuszczenia (harmonogramy, które nigdy nie "znikają"). –

+0

To ma sens, ale myślę, że po prostu założyłbym, że takie jest ryzyko zmiany czas systemowy podczas wykonywania zadania czasowego.Jeśli byłaby to tylko zmiana synchronizacji w czasie, to sądziłbym, że będą mieli opcję if (time> set_time) do uruchomienia, zamiast czekać na dokładny czas (który może zostać pominięty podczas synchronizacji czasu). – Xantham