Her x dakikada bir yöntem çağırma


116

Her 5 dakikada bir yöntem aramak istiyorum. Bunu nasıl yapabilirim?

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

Yanıtlar:


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

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

25
Aralığı ayarlamanın başka bir yolu, bir zaman aralığı nesnesi geçirmektir. Sanırım biraz daha temiz:Timespan.FromMinutes(5)
Michael Haren

2
@MichaelHaren Bunu bilmiyordum, bu çok güzel. Teşekkür ederim!
asawyer

4
@asawyer Maalesef uygulamanız bir derleme hatası veriyor. TotalMillisecondszamanlayıcı tamsayılar beklerken bir double döndürür TimeSpan. Cevabınızı TimeSpangereksiz şişkinlik kullanan ve ortadan kaldıran bir soruya güncellemeye çalıştım ; ancak, onu geri aldınız.
André C. Andersen

2
@ AndréChristofferAndersen Time yapıcısındaki 0 ​​değerini TimeSpan.Zero olarak değiştirin. Kod bundan sonra çalışır.
RredCat

2
Kod bir hata veriyor. Bu, yeni System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Asheh

54

Bunu @ asawyer'in cevabına dayandırdım. Derleme hatası almıyor gibi görünüyor, ama bazılarımız görüyor. İşte Visual Studio 2010'daki C # derleyicisinin kabul edeceği bir sürüm.

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

12
Gelecek nesil için yorum yapıyorum. Dispose()Timer nesnesinde yöntemi çağırdığınızda durur . Örnek: timer.Dispose()yukarıdaki kodu referans olarak kullanmak. Ancak bu, zamanlayıcıyı yok edecek ve tekrar kullanmanıza engel olacaktır. timer.Change(Timeout.Infinite, Timeout.Infinite)Zamanlayıcıyı aynı programda tekrar kullanmak isterseniz daha iyi olur.
Joel Trauger

1
Ancak, konsol uygulamasında çalıştırdığımda MyMethod () neden çalışmıyor
Izuagbala

@Izuagbala Nasıl kurduğunuzun ayrıntılarını bilmeden neden sizin için işe yaramadığını söylemek zor. Bu çözüm bir konsol uygulamasında test edildi.
André

Boş nedir?
Daniel Reyhanian

@DanielReyhanian nullGeri arama fonksiyonunu çağırırken argüman olarak olan , yerine bir nesne durumu ekleyebilirsiniz (yani, ilk argüman).
André C. Andersen

7

Sınıfınızın kurucusunda bir zamanlayıcı başlatın. Aralık milisaniye cinsindendir, yani 5 * 60 saniye = 300 saniye = 300000 milisaniye.

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

Ardından çağrı GetData()içinde timer_Elapsedböyle bir olay:

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

4

Çok basit hale getirebilecek bir Nuget Paketi yükledim, buradan alabilirsiniz ActionScheduler

.NET Standard 2.0'ı destekler

Ve burada onu nasıl kullanmaya başlayabilirsiniz?

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.

'CrystalJobScheduler 1.0.0' paketi yüklenemedi. Bu paketi '.NETFramework, Version = v4.5'i hedefleyen bir projeye yüklemeye çalışıyorsunuz, ancak paket bu çerçeveyle uyumlu herhangi bir derleme referansı veya içerik dosyası içermiyor. Daha fazla bilgi için paket yazarıyla iletişime geçin.
Aditya Bokade

4

A kullanma örneği 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
Zamanlayıcı daha uygundur.
Chuck Conway

1
yup herhangi bir şey beklerse Task.Delay (60 * 5 * 1000);
CMS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.