Memanggil metode setiap x menit


116

Saya ingin memanggil beberapa metode setiap 5 menit. Bagaimana saya bisa melakukan ini?

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
pengguna703016

1
atau System.Timers.Timer - dotnetperls.com/timer
sinanakyazici

Jawaban:


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

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

25
Cara lain untuk mengatur interval adalah dengan memasukkan objek rentang waktu. Saya pikir ini sedikit lebih bersih:Timespan.FromMinutes(5)
Michael Haren

2
@MichaelHaren Saya tidak tahu itu, itu sangat bagus. Terima kasih!
asawyer

4
@asawyer Sayangnya implementasi Anda memberikan kesalahan kompilasi. TotalMillisecondsmengembalikan ganda saat timer mengharapkan bilangan bulat atau TimeSpan. Saya mencoba memperbarui jawaban Anda untuk jawaban yang mempekerjakan TimeSpandan membuang pembengkakan yang tidak perlu; namun, Anda mengembalikannya.
André C. Andersen

2
@ AndréChristofferAndersen Ubah 0 dalam konstruktor Waktu ke TimeSpan.Zero. Kode berfungsi setelah ini.
RredCat

2
Kode memberikan kesalahan. Ini adalah perbaikan baru System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Asheh

54

Saya mendasarkan ini pada jawaban @ asawyer. Dia sepertinya tidak mendapatkan kesalahan kompilasi, tetapi beberapa dari kita melakukannya. Berikut adalah versi yang akan diterima oleh kompiler C # di Visual Studio 2010.

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

12
Berkomentar untuk anak cucu. Ini akan berhenti ketika Anda memanggil Dispose()metode pada objek pengatur waktu. Contoh: timer.Dispose()menggunakan kode di atas sebagai referensi. Ini akan menghancurkan pengatur waktu, dan mencegah Anda untuk menggunakannya lagi. timer.Change(Timeout.Infinite, Timeout.Infinite)akan lebih baik jika Anda ingin menggunakan timer lagi dalam program yang sama.
Joel Trauger

1
Tetapi mengapa MyMethod () tidak berjalan ketika saya menjalankannya di aplikasi konsol
Izuagbala

@Izuagbala Sulit untuk mengatakan mengapa itu tidak berhasil untuk Anda tanpa mengetahui secara khusus bagaimana Anda telah mengaturnya. Solusi ini telah diuji dalam aplikasi konsol.
André C. Andersen

Apa nolnya?
Daniel Reyhanian

@DanielReyhanian Anda bisa menambahkan status objek sebagai pengganti null, yaitu sebagai argumen saat memanggil fungsi callback (yaitu, argumen pertama).
André C. Andersen

7

Mulai pengatur waktu di konstruktor kelas Anda. Intervalnya dalam milidetik jadi 5 * 60 detik = 300 detik = 300000 milidetik.

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

Kemudian panggil GetData()di timer_Elapsedacara seperti ini:

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

4

Saya telah mengunggah Paket Nuget yang membuatnya sangat sederhana, Anda dapat memilikinya dari sini ActionScheduler

Ini mendukung .NET Standard 2.0

Dan inilah cara mulai menggunakannya

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.

Tidak dapat menginstal paket 'CrystalJobScheduler 1.0.0'. Anda mencoba untuk menginstal paket ini ke dalam proyek yang menargetkan '.NETFramework, Version = v4.5', tetapi paket tersebut tidak berisi referensi assembly atau file konten yang kompatibel dengan framework tersebut. Untuk informasi lebih lanjut, hubungi pembuat paket.
Aditya Bokade

4

Contoh penggunaan a 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
Pengatur waktu lebih cocok.
Chuck Conway

1
yup jika ada yang menggunakan menunggu Task.Delay (60 * 5 * 1000);
CMS
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.