Laden...

[Gelöst] Stunde dauerhaft überprüfen bis 04:00 Uhr

Erstellt von GreeenPeppper vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.087 Views
G
GreeenPeppper Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren
[Gelöst] Stunde dauerhaft überprüfen bis 04:00 Uhr

Bonjour,

ich versuche aktuell in einem Forms-Programm die Stunden per DateTime permanent zu vergleichen, bis um 04:00 Uhr und das um 04:00 Uhr dann eine Aktion ausgeführt wird.
Das Problem:
Es scheint so oft und so schnell zu überprüfen, dass es das Programm auf Inaktiv setzt und nichts mehr funktioniert =\
Wie kann ich jetzt verhindern, dass es nicht in den Inaktiv Status geht aber trotz dessen noch überprüft und um Punkt 04:00 Uhr meine Aktion ausführt?
Die Aktion funktioniert, hab ich schon ausprobiert.


        DateTime now = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
        DateTime then = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 4, 00, DateTime.Now.Second);

        public Form1()
        {
            InitializeComponent();
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {

                int compareValue = now.CompareTo(then);

                while(compareValue != 0)
                {
                    timer1.Start();
                    timer1.Tick += new EventHandler(timer_Tick);
                }
                if (compareValue == 0)
                {
                      //AKTION
                }

            }
        }


        void timer_Tick(object sender, EventArgs e)
        {
            int compareValue = now.CompareTo(then);
        }


16.807 Beiträge seit 2008
vor 4 Jahren

Im Endeffekt baust Du da eine Endlosschleife. Dürfte Deine CPU ziemlich belasten, da auch ein völlig falscher Ansatz.
[FAQ] Warum blockiert mein GUI?

Besser: berechne die Zeit bis 0400 und erstelle einen Timer.


TimeStamp duration = <kalkuliere hier die Zeit bis 0400>
Timer t = new System.Threading.Timer(o =>
            {
                // Mache hier etwas, wenn 0400 erreicht ist.
            },
            null,
            duration,
            TimeSpan.FromMilliseconds(-1));


Alternativ mit Reactive Extensions


TimeStamp duration = <kalkuliere hier die Zeit bis 0400>
Observable
        .Timer(duration) // bzw. mit DispatcherScheduler.Current als Parameter, wenn Du in der UI bist
        .Subscribe(
            x =>
            {
               // Mache hier etwas, wenn 0400 erreicht ist.
            });


Wozu soll das denn dienen? Hört sich nach Logik an; würde damit nicht in die Verantwortung der UI kommen.
Wenn Du erklärst, was Du vor hast, könnte man Dir bessere Lösungsmöglichkeiten erklären.

G
GreeenPeppper Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren

Danke, funktioniert perfekt!