Code für die Ausführung der Methode jeden Tag zu einer bestimmten Zeit C# - (Windows-Dienst) gescheitert
Hatte ich diesen code execute-Methode der windows-Dienst jeden Tag um 5 Uhr morgens:
EDIT:
MyService ws = new MyService ();
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
serviceHost = new ServiceHost(typeof(MyService));
serviceHost.Open();
double TimeOfExecution = 5;
DateTime now = DateTime.Now;
DateTime today5am = now.Date.AddHours(TimeOfExecution);
DateTime next5am = now <= today5am ? today5am : today5am.AddDays(1);
System.Threading.TimerCallback callback = new System.Threading.TimerCallback(ws.MethodToExecute());
var timer1 = new System.Threading.Timer(callback, null, next5am - DateTime.Now, TimeSpan.FromHours(24));
}
Ich erwartet, dass der Dienst zum ausführen in der nächste 5 Uhr, und alle 24 Stunden nach.
Methode MethodToExecute()
Tat, die ausgeführt werden, um 5 Uhr (oder einen anderen angegebenen Zeit), dass Tag, aber am nächsten Tag es konnte nicht ausgeführt werden. Es scheint auch, dass es egal ist, wenn ich Sie ausgeführt oder nicht zum ersten mal, aber es scheint, wie der service geht zu schlafen, nach einiger Zeit und nicht ausgeführt wird, so dass, wenn 5 Uhr ankommt, nicht auf den aktuellen Tag, aber am nächsten Tag, wird es nicht ausgeführt.
Hat jemand eine Idee, was falsch sein könnte?
Ich bearbeitet den code.
Beachten Sie, dass dies nicht mit der Zeit ändert. Wenn Sie die Sommerzeit, könnte es ändern, um 6 Uhr morgens oder 4 Uhr morgens.
Anstatt diesen service, wenn Sie möchten, es zu laufen, an einem bestimmten Punkt in der Zeit, die Sie könnte in Erwägung ziehen, dass es eine normale Konsolenanwendung, und es läuft mit dem Windows Task Scheduler
Ich habe mehrere Methoden innerhalb der service läuft, dass zu unterschiedlichen Zeiten und verschiedene Dinge tun (eine Methode, die ausgeführt wird, um 8 Uhr, Sekunde bei 3 Uhr und die Dritte um 9 Uhr), so dass ich denke, dass es einfacher ist, legen Sie diese auf diese Weise als in drei-Konsole-Anwendungen, die ausgeführt wird, auf verschiedene Zeiten und verschiedene Dinge tun, vor allem wenn man viele Methoden hat, weiß ich nicht, vielleicht ist es nur eine persönliche Präferenz...
InformationsquelleAutor vldmrrdjcc | 2013-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
GC holt Ihr
timer
da Sie noch keine Referenzen, um es nachOnStart
Methode.Du bist nur müssen es als eine lokale variable. Ich hoffe, Sie kennen die lokalen Variablen sind für die garbage collection freigegeben, sobald JIT sagt, dass Sie nicht mehr im code verwendet.
Fix: speichern Nur die
timer
in einer Instanz variabe, sind Sie fertig.hoffe, Sie kennen die lokalen Variablen sind für die garbage collection freigegeben, sobald JIT sagt, dass Sie nicht mehr im code verwendet. Es berechtigt für die GC. Der GC läuft wenn es muss. Es muss nicht die ganze Zeit laufen. Lesen Sie das Handbuch für weitere Informationen.
Lesen Sie meine Aussage wieder. Ich habe nie erwähnt, dass GC läuft die ganze Zeit. Ich sagte, es ist eligible für die garbage collection, welche die richtige ist. Irgendwelche Kommentare?
@ta.speot.ist Lesen Sie meine Aussage wieder. Ich habe nie erwähnt, dass GC läuft die ganze Zeit. Ich sagte, es ist für die garbage collection freigegeben, das ist korrekt. Irgendwelche Kommentare? – Sriram Sakthivel 1 min ago @SriramSakthivel Lesen Sie mein Kommentar. Speziell der Teil wo ich sage, daß
Tut mir Leid, ich denke ich nehme Sie falsch, So sind Sie auf die Bereitstellung von mehr info zur OP richtig?
InformationsquelleAutor Sriram Sakthivel
Timer knifflige Objekte. Sie unterliegen der garbage collection, wie jeder .NET-Objekte, wenn Sie nicht mehr referenziert werden. Die syntax dieser Anweisung ist genug, um zu wissen, wenn das passiert, Ihre Nutzung der
var
zeigt, dass "timer1" ist ein lokale variable einer Methode. In anderen Worten, es gibt keine Referenz Links, um das Timer-Objekt, das Sie erstellt, nachdem Sie Ihre Methode gibt.Also was genau hält einen Timer lebt und tickt, wenn es keine Referenz-Links? Sie fanden heraus: gar nichts. Ob dein timer wird tatsächlich Zecke ist ein crapshoot. Wenn Ihr Programm weiter läuft, tun andere Dinge, dann löst eine gen - #0 Sammlung und der timer verschwindet. Es wird nie eine Zecke. Wenn Ihr Programm nicht, dann wird es nicht lange genug überleben, um es um 5 Uhr morgens.
Du muss speichern die Objektreferenz in einer Variablen sorgt dafür, dass er überlebt lange genug. Das sollte ein statische variable.
Oder ein System verwenden.Timer.Timer. Es wirkt sehr wie ein System.Threading.Timer, aber hat bessere überlebens-Fähigkeiten. Es wird garantiert, um am Leben zu bleiben, solange es hat eine Elapsed-Ereignis-handler aktiviert wird.
Passant Danke auf Eure Hilfe! Und wird mein ws-variable aus MyService ws = new MyService (); lange genug Leben. Sollte ich es machen das auch statisch?
Unmöglich zu erraten. Nicht einfach willkürlich machen statische Variablen. Klingt wie dass der timer sollte ein Feld in MyService so ist es am Leben gehalten wird, solange der Dienst aktiv ist.
InformationsquelleAutor Hans Passant
Bitte Lesen Sie das Handbuch:
Einen Verweis darauf beibehalten:
InformationsquelleAutor ta.speot.is
Eine weitere option könnte sein, erzählt der GarbageCollector zu halten, die lokale variable lebendig:
InformationsquelleAutor Inrego