2014-06-23 8 views
8

Es ist klar: Stellen Sie sich zum Beispiel eine Schaltfläche in meiner Form vor. Wenn der Benutzer auf die Schaltfläche klickt, sollte nach 30 Sekunden eine void-Methode ausgeführt werden.Wie starte ich eine Methode nach einem bestimmten Zeitintervall?

Es wäre eine Void-Methode "DoAfterDelay", die 2 Eingaben benötigt, die erste ist die Methode zu tun (mit Delegaten), und die andere ist das Zeitintervall. Also ich werde haben:

public delegate void IVoidDelegate(); 
static void DoAfterDelay(IVoidDelegate TheMethod, TimeSpan Interval) 
    { 
     // *** Some code that will pause the process for "Interval". 
     TheMethod(); 
    } 

Also brauche ich nur ein Stück Code, um den Prozess für ein bestimmtes Zeitintervall zu pausieren. Bisher habe ich diesen Code zu tun:

System.Threading.Thread.Sleep(Interval); 

Aber dieser Code ist nicht gut für mich, weil es ganzen Prozess beendet und friert das Programm. Ich möchte nicht, dass das Programm in der Methode "DoAfterDelay" hängen bleibt. Deshalb ist die Thread.Sleep nutzlos.

Also könnte jemand einen besseren Weg vorschlagen? Natürlich habe ich danach gesucht, aber die meisten Lösungen, die ich gefunden habe, basieren auf der Verwendung eines Timers (wie zum Beispiel here). Aber die Verwendung eines Timers ist meine letzte Meinung, da die Methode einmal ausgeführt werden sollte und das Verwenden von Timern das Programm verwirrend zum Lesen macht. Also suche ich nach einer besseren Lösung, wenn es welche gibt. Oder muss ich vielleicht Timer verwenden?

Ich denke, ich muss mit Threads spielen, aber nicht sicher. Also frage ich mich, ob mich jemand zu einer Lösung führen könnte. Danke im Voraus.

+3

versuchen mit einem 'Timer'. – Adrian

Antwort

7

Können Sie eine Aufgabe verwenden?

Task.Factory.StartNew(() => 
    { 
     System.Threading.Thread.Sleep(Interval); 
     TheMethod(); 
    }); 
+0

Danke für die Antwort. Eigentlich ist das Spielen mit Threads die Lösung. –

+2

@ MostafaFarzán Es ist extrem ineffizient/verschwenderisch, einen Thread zu haben, der nichts tut, nur damit man nach einiger Zeit etwas Code ausführen kann. – Servy

+0

Es war in einem Szenario, wenn ein Benutzer auf eine Schaltfläche klickt, daher kein großer Overhead, da es nicht häufig vorkommen wird. Ansonsten würde ich vorschlagen, einen Taskplaner zu schreiben. –

0

DoAfterDelay startet einen Timer, der nur einmal ausgeführt wird, dass, wenn es ruft Ihre Leere ‚TheMethod'function abläuft. Warum wäre das chaotisch?

0

Hier ist, was Sie wollen:

public static void Example1c() 
    { 
     Action action = DoSomethingCool; 
     TimeSpan span = new TimeSpan(0, 0, 0, 5); 

     ThreadStart start = delegate { RunAfterTimespan(action, span); }; 
     Thread t4 = new Thread(start); 
     t4.Start(); 

     MessageBox.Show("Thread has been launched"); 
    } 
    public static void RunAfterTimespan(Action action, TimeSpan span) 
    { 
     Thread.Sleep(span); 
     action(); 
    } 
    private static void DoSomethingCool() 
    { 
     MessageBox.Show("I'm doing something cool"); 
    } 

Einer der Vorteile der Aktion ist, dass es leicht in Parameter zu übergeben modifiziert werden. Angenommen, Sie möchten eine Ganzzahl an DoSomethingCool übergeben. Nur auf diese Weise ändern:

public static void Example1c() 
    { 
     Action<int> action = DoSomethingCool; 
     TimeSpan span = new TimeSpan(0, 0, 0, 5); 
     int number = 10; 

     ThreadStart start = delegate { RunAfterTimespan(action, span, number); }; 
     Thread t4 = new Thread(start); 
     t4.Start(); 

     MessageBox.Show("Thread has been launched"); 
    } 
    public static void RunAfterTimespan(Action<int> action, TimeSpan span, int number) 
    { 
     Thread.Sleep(span); 
     action(number); 
    } 
    private static void DoSomethingCool(int number) 
    { 
     MessageBox.Show("I'm doing something cool"); 
    } 

Sehr flexibel ...

11

Dies ist, wo Sie die async erwarten Funktionalität von .Net 4.5

Sie Task.Delay eine geben, die Verzögerung in Millisekunden verwenden können, verwenden können . Dies ist eine sehr saubere Art und Weise. Beispiel:

private async void button1_Click(object sender, EventArgs e) 
    { 
     await Task.Delay(5000); 

     TheMethod(); 
    } 
0

Es gibt mehrere Methoden zum Erstellen von Thread, aber natürlich hängt es davon ab, was Sie tun. Sie können einen Thread on the fly wie folgt erstellen:

Thread aNewThread = new Thread(
    () => OnGoingFunction() 
); 
aNewThread.Start(); 

Dieser Thread im Hintergrund ausgeführt wird. Die Funktion, die Sie ausführen möchten, sollte über eine Schlafmethode verfügen, um nach der Verarbeitung zu schlafen. So etwas wie das:

private void OnGoingFunction() 
{ 
    //Code.... 
    Thread.Sleep(100); //100 ms, this is in the thead so it will not stop your winForm 
    //More code.... 
} 

Ich hoffe, dass hilft.

Eine weitere Option ist, den Thread zu erstellen, wann immer Sie ihn verarbeiten müssen, und sich nicht um die Option "Sleep" zu kümmern. Erstellen Sie einfach einen neuen Thread jedes Mal, wenn der Prozess

0

Sie sollten erstellen Coroutine

public IEnumerator waitAndRun() 
{ 
    // WAIT FOR 3 SEC 
    yield return new WaitForSeconds(3); 
    // RUN YOUR CODE HERE ... 
} 

Und nennen Sie es mit laden:

StartCoroutine(waitAndRun()); 
Verwandte Themen