Llamar a un método cada x minutos


116

Quiero llamar a algún método cada 5 minutos. ¿Cómo puedo hacer esto?

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

Respuestas:


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

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

25
Otra forma de establecer el intervalo es pasando un objeto de intervalo de tiempo. Creo que es un poco más limpio:Timespan.FromMinutes(5)
Michael Haren

2
@MichaelHaren No sabía eso, eso es muy lindo. ¡Gracias!
asawyer

4
@asawyer Desafortunadamente, su implementación da un error de compilación. TotalMillisecondsdevuelve un doble mientras que el temporizador espera números enteros o TimeSpan. Traté de actualizar su respuesta a una que emplee TimeSpany arroje hinchazón innecesaria; sin embargo, lo revertiste.
André C. Andersen

2
@ AndréChristofferAndersen Cambie 0 en el constructor Time a TimeSpan.Zero. El código funciona después de esto.
RredCat

2
El código da un error. Este es el arreglo nuevo System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Asheh

54

Basé esto en la respuesta de @ asawyer. No parece tener un error de compilación, pero algunos de nosotros sí. Aquí hay una versión que aceptará el compilador de C # en Visual Studio 2010.

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

12
Comentar para la posteridad. Se detendría cuando llamaras al Dispose()método en el objeto del temporizador. Ejemplo: timer.Dispose()usar el código anterior como referencia. Sin embargo, esto destruirá el temporizador y evitará que lo vuelva a utilizar. timer.Change(Timeout.Infinite, Timeout.Infinite)sería mejor si desea utilizar el temporizador de nuevo en el mismo programa.
Joel Trauger

1
Pero, ¿por qué MyMethod () no se ejecuta cuando lo ejecuto en la aplicación de consola
Izuagbala

@Izuagbala Es difícil decir por qué no funciona para usted sin conocer los detalles de cómo lo ha configurado. Esta solución se probó en una aplicación de consola.
André C. Andersen

¿Qué es el nulo?
Daniel Reyhanian

@DanielReyhanian Puede agregar un estado de objeto en lugar del null, es decir, como argumento al llamar a la función de devolución de llamada (es decir, el primer argumento).
André C. Andersen

7

Inicie un temporizador en el constructor de su clase. El intervalo está en milisegundos, por lo que 5 * 60 segundos = 300 segundos = 300000 milisegundos.

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

Luego llame GetData()al timer_Elapsedevento como este:

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

4

He subido un paquete Nuget que puede hacerlo tan simple que puede tenerlo desde aquí ActionScheduler

Es compatible con .NET Standard 2.0

Y aquí cómo empezar 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.

No se pudo instalar el paquete 'CrystalJobScheduler 1.0.0'. Está intentando instalar este paquete en un proyecto que tiene como objetivo '.NETFramework, Version = v4.5', pero el paquete no contiene ninguna referencia de ensamblado o archivos de contenido que sean compatibles con ese marco. Para obtener más información, comuníquese con el autor del paquete.
Aditya Bokade

4

Ejemplo de uso de 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 temporizador encaja mejor.
Chuck Conway

1
sí, si hay algo, use await Task.Delay (60 * 5 * 1000);
CMS
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.