Avatar billede GoofyDK Nybegynder
14. november 2010 - 18:28 Der er 31 kommentarer og
1 løsning

Timer i C#, skal køre en ting igennem hvert femte minut

Hej Eksperten!

Jeg har søgt på google, men ikke fundet det relevant det jeg skal bruge. Men det jeg søger er, en timer i C#. Denne timer skal køre hvert femte minut, og skal køre "server();" igennem hver gang.
Koden som den kører igennem, har jeg lavet i en server() { bla bla }. Mangler kun en timer til den :-)

God aften!
Avatar billede ksoren Nybegynder
14. november 2010 - 18:31 #1
Avatar billede GoofyDK Nybegynder
14. november 2010 - 18:41 #2
Ehm, kan godt være jeg er helt fra den. Men kan ikke rigtigt se løsningen i den :o(

Kan du måske lave et eksempel, så jeg kan fange den. :-)
Avatar billede Syska Mester
14. november 2010 - 20:09 #3
copy/paste fra siden:

public class Timer1
{

    public static void Main()
    {
        System.Timers.Timer aTimer = new System.Timers.Timer();
        aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
        // Set the Interval to 5 seconds.
        aTimer.Interval=5000;
        aTimer.Enabled=true;

        Console.WriteLine("Press \'q\' to quit the sample.");
        while(Console.Read()!='q');
    }

    // Specify what you want to happen when the Elapsed event is raised.
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("Hello World!");
    }
}


Interval er i ms ... dvs 5000 er 5 sekunder,

mvh
Avatar billede GoofyDK Nybegynder
14. november 2010 - 20:58 #4
Ja, jeg kan godt læse hvad der står på siden. Men jeg kan bare ikke lige tænke mig til det resultat jeg gerne vil have frem.
Avatar billede GoofyDK Nybegynder
14. november 2010 - 21:05 #5
Ak ja, jeg tror jeg fandt ud af det. Jeg havde bare smidt min variable forkert.

Beklager min dumhed. Smid svar.
Avatar billede GoofyDK Nybegynder
14. november 2010 - 21:16 #6
Hvis jeg skal have den til at køre hvert femte minut, og så starter programmet op, så kører den først programmet efter fem minutter.

Hvordan får jeg den til at starte med det samme, og så efter det hvert femte minut?
Avatar billede GoofyDK Nybegynder
14. november 2010 - 21:18 #7
Nevermind, jeg fandt en løsning på det problem. Jeg beklager, smid svar så vi kan få lukket det her. :o)
Avatar billede Syska Mester
14. november 2010 - 21:40 #8
Nok KSøren der skal have point ...

mvh
Avatar billede GoofyDK Nybegynder
15. november 2010 - 18:33 #9
Jeg har opdaget en lille fejl.

static void Main(string[] args)
        {
            SERVER s = new SERVER();

            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            aTimer.Interval = 300000;
            aTimer.Enabled = true;
            while (true) ;
        }
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            SERVER s = new SERVER();
        }
}

Den kører den fint igennem første gang, men hvis jeg har sat den til 5 min. Så kører den scriptet igennem (SERVER s = new SERVER();) og så går der fem min faktisk, hvor den bare står stille og ikke kommer videre, altså ligesom at den "hænger" i det. Når de fem min så er gået, så kører det umiddelbart normalt. Men hvordan retter jeg denne "fejl"?
Avatar billede Syska Mester
15. november 2010 - 18:41 #10
aTimer.AutoReset = true;
aTimer.Start();

Skal du nok også have med ... ellers tror jeg aldrig den vil køre ...

Men den kører jo ikke første gang ... så du skal vente 5 mins før du får første event fra din Timer.

Du kan jo nemt finde ud af hvad den gør.
Tilføj:
Console.WriteLine(DateTime.Now.ToString())
I din event og fjern SERVER s = new SERVER();

Så kan du hurtigt se hvad der sker og hvor tit dit event kommer.

Sæt tiden ned til 5000, så du får nogen flere Elapsed events.

mvh
Avatar billede GoofyDK Nybegynder
15. november 2010 - 19:44 #11
Jeg har lavet denne:

            int l = 10;
            for (int i = 1; i < l; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }

Men den begynder først at tælle efter 5 sec. Og så tæller den også fint efter, og kører f.eks.

1
2
3
4
5
1
6
2
7

Det vil sige, at den overlapper som den skal, men først efter de 5 sec.

Eller har jeg placeret:
            aTimer.AutoReset = true;
            aTimer.Start();
forkert? Har tilføjet det under aTimer.Enabled = true;
Avatar billede Syska Mester
15. november 2010 - 19:47 #12
Den skal jo også først starte efter 5 sekunder.

Det er hvad du beder den om ... hvis du trykker på "Start" på et stop ur, så viser den jo heller ikke 5 sekunder med det samme, men ja, først efter 5 sekunder.

Du må starte en manuelt samme tid du starter din timer så ...

eller lade den have et Internal på 0 sekunder ... og så lave din genstarter af din timer inden i eventen, og sætte AutoReset = false;

mvh
Avatar billede GoofyDK Nybegynder
15. november 2010 - 20:51 #13
Jamen det har jeg prøvet, at starte den manuelt.
Det gjorde jeg i denne:

static void Main(string[] args)
        {
            SERVER s = new SERVER();

            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            aTimer.Interval = 300000;
            aTimer.Enabled = true;
            while (true) ;
        }
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            SERVER s = new SERVER();
        }
}

Og så gik det hele i stå i 5 min, og forsatte igen. Men den skal jo ikke gå i stå, hvor alt er gået i stå.
Den skal jo bare køre programmet, og når der så er gået 5 min, skal den køre scriptet igennem igen. Hvor den genoptager forbindelsen til serveren.

Håber du forstår mig bedre nu.
Avatar billede Syska Mester
15. november 2010 - 23:01 #14
i Stedet for den while ... så lav en:
Console.ReadKey();

Så kører programmet indtil du trykker på en tast.

Hvad havde du forventet programmet skulle gøre mens den venter 5 mins ?

Der er jo ingen kode som gør noget ...
1. Du laver en instance af SERVER.
2. Laver en Timer.
3. Gået 5 Mins og laver en ny instance.
( step 3 gentager sig så )

Hvad mangler der i programmet ?
Avatar billede GoofyDK Nybegynder
15. november 2010 - 23:12 #15
Det jeg forventer er, at den kører scriptet igennem og bare kører videre. Når der så er gået 5 minutter, kører den igennem igen.

Det vil sige, mit script henter og modtager data fra serveren. Når der så er gået fem minutter, så kører den et script igennem - som genoptager evt. tabt forbindelse.

Jeg kan bare ikke se, hvor problemet ligger.
Avatar billede Syska Mester
15. november 2010 - 23:30 #16
Det gør den kode du har ovenfor også ... den gør præcis hvad der står ...

Jeg har lidt svært ved at spore mig ind på hvad du mener den ikke gør ...

Du kan jo lave et par Console.WriteLine("noget tekst") på den måde kan du jo se hvor i programmet den kommer hen ... og hvor den ikke kommer hen(altså hvis den ikke udskriver hvad du havde forventet )

mvh
Avatar billede Syska Mester
15. november 2010 - 23:33 #17
using System;
using System.Timers;

namespace Exp923981
{
    class Program
    {
        static void Main(string[] args)
        {
            Timer t = new Timer();
            t.Interval = 3000;
            t.AutoReset = true;
            t.Elapsed += new ElapsedEventHandler(t_Elapsed);
            t_Elapsed(null, null);
            t.Start();
            Console.ReadKey();
        }

        static void t_Elapsed(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine(DateTime.Now);
        }
    }
}
Avatar billede GoofyDK Nybegynder
16. november 2010 - 08:49 #18
Jamen det jeg vil have den til er, den f.eks. skal køre denne kode:

            int l = 10;
            for (int i = 1; i < l; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }

Så det bliver:

1
2
3
4
5
6
7
osv.

Og så når der er gået 5 min, skal den kører scriptet igennem igen. Men den går i "stå", forstået på den måde. At hvis du sætter tiden på 3 sek, så skriver den:

1
2
3
4
5
6
7
osv.

Men fejlen er, at den skulle haft startet med 1 igen efter tre, det vil så sige, det kører scriptet igennem og når den har gjort det. Venter den i tre sekunder med at gå videre.

Det jeg vil have den skal gøre er, at den skal køre igennem og når der er gået tre sekunder. Skal den så køre igennem igen. UDEN den stopper noget af det den har gang i.
For stopper den med at sende og modtage data via serveren, så er der data der går tabt. Det vil jeg ikke have.

Kan du følge mig nu?
Avatar billede Syska Mester
16. november 2010 - 09:04 #19
Så sagt på en anden måde.

Du vil starte et job hvert 5 min, som kan ske at tage længere tid end 5 mins. Lige så snart jobbet er startet, vil du lade timeren starte igen ?

eller er det den modsatte vej ?

mvh
Avatar billede GoofyDK Nybegynder
16. november 2010 - 09:18 #20
Det jeg vil have er, at når jeg starter mit program. Så starter den min data forbindelsen til serveren, den kommunikere frem og tilbage med data. Det vil sige, at programmet er igang hele tiden. Det holder ingen pause, for der er måske flere servere som programmet kommunikere med. Så hjælper det jo ikke meget, at en timer på 5 min, så "stopper" alt hvad der sker i programmet. For så mister jeg jo meget data på de 5 min.

Så det jeg helt præcis vil have er:
Start af program, den kører mit script igennem til server(ne). Hvert 5. min, kører den mit tilslutnings script igennem til server(ne). Dette skal ske UDEN programmet kommer til at stå stille.

Jeg synes det er lidt svært at forklare, men håber det hjælper på det. :-)
Avatar billede Syska Mester
16. november 2010 - 09:37 #21
Det virker som om der er en del af dit program jeg ikke ser, og derfor ikke kan sætte mig ind i hvad der præcist sker.

Kan du poste mere kode ?

mvh
Avatar billede GoofyDK Nybegynder
16. november 2010 - 09:42 #22
Jamen det jeg bruger pt. for at teste det, det er:

            int l = 10;
            for (int i = 1; i < l; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }

For at se hvordan min timer "stopper".
Avatar billede Syska Mester
16. november 2010 - 10:48 #23
Jeg er helt tabt ...

Måske jeg ikke kan se skoven for alle træerne.

Kan du ikke poste _ALT_ kode som har relevans her ... overstående er jo ikke alt kode. Der mangler Main, Timer, og andre ting. behøver ikke alle dependencies, men bare hvad du bruger, så jeg nemmere kan gennemskue hvad det er der ikke sker.

Pt har jeg kun set en constructor køre, som ikke burde have noget logic i sig.

mvh
Avatar billede GoofyDK Nybegynder
16. november 2010 - 11:03 #24
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading;
using System.Text.RegularExpressions;
using System.Timers;
using System.Collections;
using System.ComponentModel;

namespace Projekt
{
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            SERVER s = new SERVER();

            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            aTimer.Interval = 3000;
            aTimer.Enabled = true;
            while (true) ;
        }
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            SERVER s = new SERVER();
        }
    }
    class SERVER
    {
        public SERVER()
        {
            int l = 10;
            for (int i = 1; i < l; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }
        }
    }
}

Så prøv, så kan du se det :)
Avatar billede Syska Mester
16. november 2010 - 11:27 #25
Ahhh ... nu er det mere klart. Kode siger mere end 1000 ord :-)

Prøv følgende:
using System;
using System.Threading;
using System.Timers;

namespace Projekt
{
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var aTimer = new System.Timers.Timer();
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            aTimer.Interval = 3000;
            aTimer.AutoReset = true;

            aTimer.Start();
            OnTimedEvent(null, null);

        }
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            var s = new Server();
        }
    }
    class Server
    {
        public Server()
        {
            int l = 10;
            for (int i = 1; i < l; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }
        }
    }
}
Avatar billede GoofyDK Nybegynder
16. november 2010 - 11:33 #26
Det var da også dejligt, det skulle jeg bare haft postet for lang tid siden :)

Umiddelbart ser det rigtigt nok ud, men er det meningen at min console skal lukke ned efter tællingen?
Avatar billede Syska Mester
16. november 2010 - 11:45 #27
Ja, jeg efterlyste efter din kode tidligere. Jeg troede egentlig at du havde ændret det ... men sådan er der så mange ting.

Ups, nej ...

Smid en Console.ReadKey(); ind efter OnTimedEvent(null, null);

Man kan hurtigt snakke forbi hinanden :-)
Avatar billede Syska Mester
16. november 2010 - 11:46 #28
Problemet med while(true); er den det tager CPU tid.
Avatar billede GoofyDK Nybegynder
16. november 2010 - 11:47 #29
Men de gør det samme i sidste ende?
Og jeg går vel udfra, det er dig som skal have pointsne :o)
Avatar billede Syska Mester
16. november 2010 - 11:51 #30
Ja, de gør mere eller mindre det samme ... Console.ReadKey er bare lidt pænere og er hvad jeg ville bruge.

mht til point er fordelingen nok lidt anderledens nu, men det er jo op til dig.

mvh
Avatar billede GoofyDK Nybegynder
16. november 2010 - 11:58 #31
Jeg har fået mest ud af din hjælp. At han linker til en artikel er også fint nok, men bliver han utilfreds - så må vi tage den derfra. :)

Endnu engang tak for hjælpen Buz.
Avatar billede GoofyDK Nybegynder
16. november 2010 - 12:00 #32
Jeg skal lige lave en tråd mere, for det er med txt filer. Hvor man læser fra dem, og hvis en string indholder et ord fra filen. Så skal der ske noget. :) Så hvis du er klar og kan hjælpe, så er der en ny tråd på vej. :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester