webentwicklung-frage-antwort-db.com.de

Wie führe ich eine Methode nach einem bestimmten Zeitintervall aus?

Es ist klar: Stellen Sie sich zum Beispiel einen Button in meinem Formular vor. Wenn ein Benutzer auf die Schaltfläche klickt, sollte nach 30 Sekunden eine ungültige Methode ausgeführt werden.

Es würde eine void-Methode DoAfterDelay geben, die zwei Eingabeparameter benötigt. Die erste ist die Methode (mit Delegaten) und die andere ist das Zeitintervall. Also werde ich haben:

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

Ich brauche also nur ein Stück Code, um den Prozess für ein bestimmtes Zeitintervall anzuhalten. Bisher habe ich diesen Code dazu benutzt:

System.Threading.Thread.Sleep(Interval);

Dieser Code ist jedoch nicht gut für mich, weil er den gesamten Prozess stoppt und das Programm einfriert. Ich möchte nicht, dass das Programm in der DoAfterDelay-Methode hängen bleibt. Deshalb ist der Thread.Sleep unbrauchbar.

Könnte jemand einen besseren Weg vorschlagen? Natürlich habe ich danach gesucht, aber die meisten Lösungen, die ich gefunden habe, basierten auf der Verwendung eines Timers (wie hier zum Beispiel). Die Verwendung eines Timers ist jedoch meine letzte Meinung, weil die Methode einmal ausgeführt werden sollte und das Verwenden von Timern das Programm verwirrend macht. Also bin ich auf der Suche nach einer besseren Lösung. Oder muss ich vielleicht Timer verwenden?

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

13
Mostafa Farzán

Kannst du eine Aufgabe benutzen?

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

Hier können Sie die async-erwartet Funktionalität von .Net 4.5 verwenden

Sie können Task.Delay verwenden und die Verzögerung in Millisekunden angeben .. Dies ist ein sehr sauberer Weg. Ex:

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

        TheMethod();
    }
13
Jimmy Hannon

Sie sollten eine Coroutine erstellen. 

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

Und nenne es mit:

StartCoroutine(waitAndRun());
0
David

Sie können die genauen Sekunden mit angeben

DateTime runTime = new DateTime();
double waitSeconds = (runTime - DateTime.Now).TotalSeconds;

Task.Factory.StartNew(() =>
{
    Thread.Sleep(TimeSpan.FromSeconds(waitSeconds));
    YourMethod();
});

runTime => Wenn Sie die Methode ausführen möchten.

0
Amey Vartak

Hier ist was du willst:

    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");
    }

Die Verwendung von Action hat den Vorteil, dass sie leicht geändert werden kann, um Parameter zu übergeben. Angenommen, Sie möchten eine Ganzzahl an DoSomethingCool übergeben. Modifizieren Sie einfach so:

    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...

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

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

Dieser Thread wird im Hintergrund ausgeführt. Die Funktion, die Sie ausführen möchten, sollte über eine Schlafmethode verfügen, wenn die Verarbeitung abgeschlossen ist. Also so etwas wie:

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 das hilft.

Eine weitere Option besteht darin, den Thread immer dann zu erstellen, wenn Sie ihn bearbeiten müssen und sich nicht um die Schlafoption kümmern müssen. Erstellen Sie einfach jedes Mal einen neuen Thread, um den Prozess zu laden

0

DoAfterDelay startet einen Timer, der nur einmal ausgeführt wird. Wenn er abläuft, ruft er Ihre leere 'TheMethod'-Funktion auf.

0
Bluemoon10