14. november 2010 - 18:28Der 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 :-)
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!"); } }
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"?
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;
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.
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å )
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.
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 )
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.
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. :-)
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.
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); } } } }
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); } } } }
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)
Synes godt om
Ny brugerNybegynder
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.