Aufruf einer Methode alle x Minuten


116

Ich möchte alle 5 Minuten eine Methode aufrufen. Wie kann ich das machen?

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("*** calling MyMethod *** ");
        Console.ReadLine();
    }

    private MyMethod()
    {
        Console.WriteLine("*** Method is executed at {0} ***", DateTime.Now);
        Console.ReadLine();
    }
}

10
System.Threading.Timer
user703016

1
oder System.Timers.Timer - dotnetperls.com/timer
sinanakyazici

Antworten:


182
var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromMinutes(5);

var timer = new System.Threading.Timer((e) =>
{
    MyMethod();   
}, null, startTimeSpan, periodTimeSpan);

25
Eine andere Möglichkeit, das Intervall festzulegen, besteht darin, ein Zeitspannenobjekt zu übergeben. Ich denke, es ist ein bisschen sauberer:Timespan.FromMinutes(5)
Michael Haren

2
@ MichaelHaren Das wusste ich nicht, das ist sehr schön. Danke dir!
Asawyer

4
@asawyer Leider gibt Ihre Implementierung einen Kompilierungsfehler. TotalMillisecondsGibt ein Double zurück, während der Timer Ganzzahlen oder erwartet TimeSpan. Ich habe versucht, Ihre Antwort auf eine zu aktualisieren TimeSpan, die unnötiges Aufblähen verwendet und auswirft. Sie haben es jedoch zurückgesetzt.
André C. Andersen

2
@ AndréChristofferAndersen Ändere 0 im Zeitkonstruktor in TimeSpan.Zero. Code funktioniert danach.
RredCat

2
Code gibt einen Fehler aus. Dies ist der Fix neuer System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Asheh

54

Ich habe dies auf der Antwort von @ asawyer basiert. Er scheint keinen Kompilierungsfehler zu bekommen, aber einige von uns tun dies. Hier ist eine Version, die der C # -Compiler in Visual Studio 2010 akzeptiert.

var timer = new System.Threading.Timer(
    e => MyMethod(),  
    null, 
    TimeSpan.Zero, 
    TimeSpan.FromMinutes(5));

12
Kommentieren für die Nachwelt. Es würde aufhören, wenn Sie die Dispose()Methode für das Timer-Objekt aufrufen. Beispiel: timer.Dispose()Verwenden Sie den obigen Code als Referenz. Dadurch wird der Timer jedoch zerstört und Sie können ihn nicht mehr verwenden. timer.Change(Timeout.Infinite, Timeout.Infinite)Wäre besser, wenn Sie den Timer wieder im selben Programm verwenden möchten.
Joel Trauger

1
Aber warum wird MyMethod () nicht ausgeführt, wenn ich es in einer Konsolenanwendung
ausführe

@Izuagbala Es ist schwer zu sagen, warum es bei Ihnen nicht funktioniert, ohne zu wissen, wie Sie es eingerichtet haben. Diese Lösung wurde in einer Konsolenanwendung getestet.
André C. Andersen

Was ist die Null?
Daniel Reyhanian

@DanielReyhanian Sie können einen Objektstatus anstelle des null, dh als Argument, beim Aufrufen der Rückruffunktion (dh des ersten Arguments) hinzufügen .
André C. Andersen

7

Starten Sie einen Timer im Konstruktor Ihrer Klasse. Das Intervall ist in Millisekunden angegeben, also 5 * 60 Sekunden = 300 Sekunden = 300000 Millisekunden.

static void Main(string[] args)
{
    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = 300000;
    timer.Elapsed += timer_Elapsed;
    timer.Start();
}

Rufen Sie dann GetData()die timer_ElapsedVeranstaltung wie folgt an:

static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    //YourCode
}

4

Ich habe ein Nuget-Paket hochgeladen, das es so einfach macht, dass Sie es von hier aus haben können. ActionScheduler

Es unterstützt .NET Standard 2.0

Und hier, wie man es benutzt

using ActionScheduler;

var jobScheduler = new JobScheduler(TimeSpan.FromMinutes(8), new Action(() => {
  //What you want to execute
}));

jobScheduler.Start(); // To Start up the Scheduler

jobScheduler.Stop(); // To Stop Scheduler from Running.

Das Paket 'CrystalJobScheduler 1.0.0' konnte nicht installiert werden. Sie versuchen, dieses Paket in einem Projekt zu installieren, das auf '.NETFramework, Version = v4.5' abzielt, aber das Paket enthält keine Assemblyreferenzen oder Inhaltsdateien, die mit diesem Framework kompatibel sind. Weitere Informationen erhalten Sie vom Autor des Pakets.
Aditya Bokade

4

Beispiel für die Verwendung von Timer:

using System;
using System.Timers;

static void Main(string[] args)
{
    Timer t = new Timer(TimeSpan.FromMinutes(5).TotalMilliseconds); // Set the time (5 mins in this case)
    t.AutoReset = true;
    t.Elapsed += new System.Timers.ElapsedEventHandler(your_method);
    t.Start();
}

// This method is called every 5 mins
private static void your_method(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("..."); 
}


0
while (true)
{
    Thread.Sleep(60 * 5 * 1000);
    Console.WriteLine("*** calling MyMethod *** ");
    MyMethod();
}

10
Ein Timer passt besser.
Chuck Conway

1
yup wenn irgendetwas verwendet wird, warten Sie auf Task.Delay (60 * 5 * 1000);
CMS
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.