2011-01-13 14 views
6

Ich habe zwei alternative Verwendung von Timer oder Schlaf mit, ich brauche alle 3 Sekunden nach dieser Methode ein Verfahren zu nennen ist abgeschlossen, ich schrieb einfaches Beispiel zu zeigen, was ich meine:Was soll ich schlafen oder Timer

public static void Main() 
{ 
    new Thread(new ThreadStart(fooUsingSleep)).Start(); 

    callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000); 
} 

public static void fooUsingSleep() 
{ 
    Console.WriteLine("Doing some consuming time work using sleep"); 
    Thread.Sleep(3000); 
    fooUsingSleep(); 
} 

public static void fooUsingTimer(object dummy, ElapsedEventArgs dummyElapsed) 
{ 
    Console.WriteLine("Doing some consuming time work usning timer"); 
    callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000); 
} 

public static void callToMethodAfterInterval(Action<object,ElapsedEventArgs> inMethod, int inInterval) 
{ 
    System.Timers.Timer myTimer = new System.Timers.Timer(); 
    myTimer.Elapsed += new ElapsedEventHandler(inMethod); 
    myTimer.Interval = inInterval; 
    myTimer.AutoReset = false; 
    myTimer.Start(); 
} 

Also meine Fragen sind

1) Kann ich den Code mit dem Timer eleganter geschrieben? Bedeutet das Entfernen des Aufrufs der Methode callToMethodAfterInterval von fooUsingTimer, das Erstellen des Timers mit ein oder zwei Zeilen und das Entfernen der Dummy-Variablen aus der Deklaration von fooUsingTimer?

2) Ich verstehe Schlaf ist nicht beschäftigt warten (http://www.codeproject.com/KB/threads/ThreadingDotNet.aspx) So habe ich keine Rechtfertigung finden, die Timer-Option hier zu verwenden, weil die Schlaf ist einfacher, was ist besser zu benutzen, die Timer-Version oder die Schlaf-Version?

3) Ich weiß, dass Timers.timer Thread-sicher ist, kann es mir in dem Verhalten helfen, das ich implementieren möchte?

Danke.

Antwort

2

Der reale Kontext Ihres Programms ist auch wichtig.

Die Schlafoption "verschwendet" einen Thread, kein Problem in einer kleinen Konsolen-App, aber im Allgemeinen keine gute Idee.

Sie müssen den Timer nicht neu starten, wird die folgende Ticken halten:

static void Main(string[] args) 
    { 
     var t = new System.Timers.Timer(1000); 
     t.Elapsed += (s, e) => CallMeBack(); 
     t.Start(); 

     Console.ReadLine(); 
    } 
+1

Ich würde bemerken, dass ich nicht denke, dass dies genau das ist, was das Original tun sollte - es war eine langwierige Aufgabe und es dann wieder 3 Sekunden nach der Fertigstellung auszuführen - wird es jede Sekunde laufen? – Paddy

+0

@Paddy, richtig, ich nahm eine relativ kurze Aufgabe an. Das OP sollte erzählen. –

+0

Ich möchte nicht, dass die Option foo aufgerufen wird, bevor die anderen Aufrufe von foo beendet sind. – Delashmate

0

Sleep wird den Trick, Timer auf der anderen Seite wurde für genau diesen Zweck entwickelt, Konventionen sind besser und sie werden in der Regel Ihren Code verständlicher machen.

+0

Wie kann ich den Timer Teil elegantere schreiben? – Delashmate

3

Sie Sie erkennen, dass fooUsingSleep sich immer und immer wieder ruft? Es wird schließlich einen Stapelüberlauf erzeugen.

Wenn Sie Timer verwenden, können sie, da dies so einfach sein:

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); 
    t.Interval = 3000; 
    t.Tick += new EventHandler((o,ea) => Console.WriteLine("foo")); 
+0

+1 für elegante Lösung zu deklarieren, wie es Stapelüberlauf verursachen wird? Ich kann es nicht sehen, in Ihrer Lösung kann die Methode aufgerufen werden, bevor die letzte abgeschlossen ist, und es kann dazu führen, dass harte Fehler zu finden, so dass dieser Grund nicht als Antwort – Delashmate

+1

markiert ist, kann nicht vor dem letzten aufgerufen werden ist beendet, weil sie auf demselben Thread ausgeführt werden. Ihre Lösung (Aufruf von fooUsingSleep() von fooUsingSleep() wird schließlich den Stack überfluten, da der Ausführungskontext bei jedem Methodenaufruf auf einen Stack geschoben wird, der nicht unbegrenzt Kapazität hat) – Axarydax

+0

Ok, jetzt verstehe ich den von Ihnen erwähnten Stack-Überlauf:) – Delashmate

Verwandte Themen