Chiamare un metodo ogni x minuti


116

Voglio chiamare un metodo ogni 5 minuti. Come posso fare questo?

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
o System.Timers.Timer - dotnetperls.com/timer
sinanakyazici

Risposte:


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

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

25
Un altro modo per impostare l'intervallo è passare un oggetto timespan. Penso che sia un po 'più pulito:Timespan.FromMinutes(5)
Michael Haren

2
@MichaelHaren Non lo sapevo, è molto carino. Grazie!
avvocato

4
@asawyer Sfortunatamente la tua implementazione dà un errore di compilazione. TotalMillisecondsrestituisce un double mentre il timer si aspetta numeri interi o TimeSpan. Ho provato ad aggiornare la tua risposta a una che utilizza TimeSpane butta fuori inutili gonfiori; tuttavia, l'hai ripristinato.
André C. Andersen

2
@ AndréChristofferAndersen Cambia 0 nel costruttore Time in TimeSpan.Zero. Il codice funziona dopo questo.
RredCat

2
Il codice restituisce un errore. Questa è la nuova correzione System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Asheh

54

L'ho basato sulla risposta di @ asawyer. Non sembra ricevere un errore di compilazione, ma alcuni di noi lo fanno. Ecco una versione che il compilatore C # in Visual Studio 2010 accetterà.

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

12
Commentando per i posteri. Si fermava quando si chiamava il Dispose()metodo sull'oggetto timer. Esempio: timer.Dispose()utilizzo del codice sopra come riferimento. Tuttavia, questo distruggerà il timer e ti impedirà di usarlo di nuovo. timer.Change(Timeout.Infinite, Timeout.Infinite)sarebbe meglio se si desidera utilizzare di nuovo il timer nello stesso programma.
Joel Trauger

1
Ma perché MyMethod () non viene eseguito quando lo
eseguo

@Izuagbala È difficile dire perché non funziona per te senza conoscere i dettagli di come l'hai impostato. Questa soluzione è stata testata in un'applicazione console.
André C. Andersen

Qual è il null?
Daniel Reyhanian

@DanielReyhanian È possibile aggiungere uno stato dell'oggetto invece di null, cioè come argomento quando si chiama la funzione di callback (cioè il primo argomento).
André C. Andersen

7

Avvia un timer nel costruttore della tua classe. L'intervallo è in millisecondi, quindi 5 * 60 secondi = 300 secondi = 300000 millisecondi.

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

Quindi chiama GetData()l' timer_Elapsedevento in questo modo:

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

4

Ho caricato un pacchetto Nuget che può renderlo così semplice, puoi averlo da qui ActionScheduler

Supporta .NET Standard 2.0

E qui come iniziare a usarlo

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.

Impossibile installare il pacchetto "CrystalJobScheduler 1.0.0". Stai tentando di installare questo pacchetto in un progetto che ha come destinazione '.NETFramework, Version = v4.5', ma il pacchetto non contiene riferimenti ad assembly o file di contenuto compatibili con quel framework. Per ulteriori informazioni, contattare l'autore del pacchetto.
Aditya Bokade

4

Esempio di utilizzo di 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
Un timer è più adatto.
Chuck Conway

1
sì, semmai usa wait Task.Delay (60 * 5 * 1000);
CMS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.