Appel d'une méthode toutes les x minutes


116

Je veux appeler une méthode toutes les 5 minutes. Comment puis-je faire ceci?

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

Réponses:


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

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

25
Une autre façon de définir l'intervalle consiste à transmettre un objet timepan. Je pense que c'est un peu plus propre:Timespan.FromMinutes(5)
Michael Haren

2
@MichaelHaren Je ne savais pas ça, c'est très bien. Je vous remercie!
asawyer

4
@asawyer Malheureusement, votre implémentation donne une erreur de compilation. TotalMillisecondsrenvoie un double tandis que le minuteur attend des entiers ou TimeSpan. J'ai essayé de mettre à jour votre réponse à celle qui emploie TimeSpanet jette des ballonnements inutiles; cependant, vous l'avez annulée.
André C. Andersen

2
@ AndréChristofferAndersen Remplacez le constructeur 0 par TimeSpan.Zero. Le code fonctionne après cela.
RredCat

2
Le code donne une erreur. Ceci est le nouveau correctif System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Asheh

54

Je me suis basé sur la réponse de @ asawyer. Il ne semble pas avoir d'erreur de compilation, mais certains d'entre nous le font. Voici une version que le compilateur C # de Visual Studio 2010 acceptera.

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

12
Commenter pour la postérité. Il s'arrêterait lorsque vous appeliez la Dispose()méthode sur l'objet timer. Exemple: en timer.Dispose()utilisant le code ci-dessus comme référence. Cela détruira cependant la minuterie et vous empêchera de l'utiliser à nouveau. timer.Change(Timeout.Infinite, Timeout.Infinite)serait préférable si vous souhaitez utiliser à nouveau la minuterie dans le même programme.
Joel Trauger

1
Mais pourquoi MyMethod () ne fonctionne-t-il pas lorsque je l'exécute dans une application console
Izuagbala

@Izuagbala Il est difficile de dire pourquoi cela ne fonctionne pas pour vous sans connaître les détails de la façon dont vous l'avez configuré. Cette solution a été testée dans une application console.
André C. Andersen

Quel est le nul?
Daniel Reyhanian

@DanielReyhanian Vous pouvez ajouter un état d'objet au lieu de null, c'est-à-dire comme argument lors de l'appel de la fonction de rappel (c'est-à-dire le premier argument).
André C. Andersen

7

Démarrez un minuteur dans le constructeur de votre classe. L'intervalle est en millisecondes donc 5 * 60 secondes = 300 secondes = 300000 millisecondes.

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

Appelez ensuite GetData()l' timer_Elapsedévénement comme ceci:

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

4

J'ai téléchargé un package Nuget qui peut le rendre si simple, vous pouvez l'avoir à partir d'ici ActionScheduler

Il prend en charge .NET Standard 2.0

Et voici comment commencer à l'utiliser

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.

Impossible d'installer le package «CrystalJobScheduler 1.0.0». Vous essayez d'installer ce package dans un projet qui cible «.NETFramework, Version = v4.5», mais le package ne contient aucune référence d'assembly ou fichier de contenu compatible avec ce framework. Pour plus d'informations, contactez l'auteur du package.
Aditya Bokade

4

Exemple d'utilisation d'un 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
Une minuterie est un meilleur ajustement.
Chuck Conway

1
yup si quelque chose utilise wait Task.Delay (60 * 5 * 1000);
CMS
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.