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.