2012-10-22 33 views
58

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

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(); 
    } 
} 
+9

'System.Threading.Time r' –

+1

o System.Timers.Timer - http://www.dotnetperls.com/timer – sinanakyazici

risposta

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

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

Un altro modo per impostare l'intervallo è passare in un oggetto temporizzato. Penso che sia un po 'più pulito: ['Timespan.FromMinutes (5)'] (http://msdn.microsoft.com/en-us/library/system.timespan.fromminutes.aspx) –

+2

@MichaelHaren Non l'ho fatto lo so, è molto bello Grazie! – asawyer

+0

Penso che ci sia un problema con l'oggetto temporizzato perché non è il tipo giusto (come è), rispetto a solo '0, 5 * 60 * 1000'. Ad ogni modo, per me genera un errore. – amiregelz

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

Un timer è una soluzione migliore. –

+2

non è inefficiente usare thread.sleep ??? –

+1

Non solo inefficiente, ma bloccherà anche il thread – Gaspa79

42

ho basato questo su risposta di @ asawyer. Non sembra ottenere 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)); 
+2

Come interrompere questo? –

+5

Commentando per i posteri. Si fermerebbe quando hai chiamato il metodo 'Dispose()' sull'oggetto timer. Esempio: 'timer.Dispose()' utilizzando il codice sopra come riferimento. Questo distruggerà il timer, tuttavia, e ti impedirà di usarlo di nuovo. 'timer.Change (Timeout.Infinite, Timeout.Infinite)' sarebbe meglio se si desidera utilizzare nuovamente il timer nello stesso programma. –

1

Esempio di utilizzo di timer.

using system.timers; 

static void Main(string[] args)() 
{ 
    Timer t = new Timer(TimeSpan.FromMinutes(5).TotalMiliseconts); // set the time (5 min in this case) 
    t.AutoReset = true; 
    t.Elapsed += new System.Timers.ElapsedEventHandler(your_method); 
    t.Start(); 
} 
// this method calls every 5 min 
private void your_method(object sender, ElapsedEventArgs e) 
{ 
    Console.WriteLine("..."); 
} 
1

Avviare un timer nel costruttore della 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(); 
} 

Poi chiamare GetData() in caso timer_Elapsed in questo modo:

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

Ho caricato un pacchetto Nuget che può rendere così semplice, si può avere da qui CrystalJobScheduler

E qui come iniziare ad usarlo

using CrystalJobScheduler; 

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. 
+0

Non più elencato su nuget.org – k3davis

+0

@ k3davis ho aggiornato il collegamento Nuget –

Problemi correlati