4 Stimmen

Führe eine Methode für eine Minute aus und stoppe sie.

timer1= new System.Windows.Forms.Timer();
timer1.Interval =60000; // 1 min
timer1.Start();
MeineMethode();
timer1.Stop();

MeineMethode()

-hat eine Schleife für 90.000 Einträge (und einige Validierungen in dieser Schleife).

for (int i = 0; i <= 90000; i++)
{
 //Validierungen hier einfügen

}

Wenn die Zeit im timer1 abgelaufen ist, also eine Minute vergangen ist, möchte ich das Ausführen anderer Einträge in der Schleife stoppen. Wenn zum Beispiel 45.000 Einträge innerhalb einer Minute abgeschlossen sind, möchte ich die Methode stoppen, also die Methode nach einer Minute stoppen.

Allerdings führt der obige Timer-Code dazu, dass alle 90.000 Datensätze weiterhin in der Schleife durchlaufen werden, die Methode läuft jedoch irgendwie nicht für eine Minute? Kann mir jemand helfen?

0voto

Matthew Watson Punkte 96106

Wenn Sie einen CancellationTokenSource mit dem CancellationTokenSource(TimeSpan) Konstruktor verwenden, wird es einfach, eine Methode zu schreiben, die nach einer bestimmten Zeit eine Aktion abbricht.

Sie können eine Methode wie folgt schreiben:

public static void RunTimedAction(Action action, TimeSpan timeout)
{
    using (var cancellationTokenSource = new CancellationTokenSource(timeout))
        action(cancellationTokenSource.Token);
}

Dann können Sie eine Aktion schreiben, die einen CancellationToken als Parameter akzeptiert, so wie hier:

private void action(CancellationToken cancel)
{
    int i;

    for (i = 0; i < 1000000; ++i)
    {
        if (cancel.IsCancellationRequested)
            break;

        Thread.Sleep(10); // Arbeit simulieren.
    }

    Console.WriteLine("Aktion erreicht " + i);
}

Was Sie so verwenden können:

Console.WriteLine("Gestartet um " + DateTime.Now);

RunTimedAction(action, TimeSpan.FromSeconds(10));

Console.WriteLine("Beendet um " + DateTime.Now);

Lassen Sie uns das in ein vollständiges Demoprogramm zusammenstellen:

using System;
using System.Threading;

namespace Demo
{
    class Program
    {
        void run()
        {
            Console.WriteLine("Gestartet um " + DateTime.Now);

            RunTimedAction(action, TimeSpan.FromSeconds(10));

            Console.WriteLine("Beendet um " + DateTime.Now);
        }

        private void action(CancellationToken cancel)
        {
            int i;

            for (i = 0; i < 1000000; ++i)
            {
                if (cancel.IsCancellationRequested)
                    break;

                Thread.Sleep(10); // Arbeit simulieren.
            }

            Console.WriteLine("Aktion erreicht " + i);
        }

        public static void RunTimedAction(Action action, TimeSpan timeout)
        {
            using (var cancellationTokenSource = new CancellationTokenSource(timeout))
                action(cancellationTokenSource.Token);
        }

        static void Main()
        {
            new Program().run();
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X