Gọi một phương thức cứ x phút một lần


116

Tôi muốn gọi một số phương thức cứ sau 5 phút. Tôi có thể làm cái này như thế nào?

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

Câu trả lời:


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

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

25
Một cách khác để đặt khoảng thời gian là truyền vào một đối tượng khoảng thời gian. Tôi nghĩ rằng đó là một chút bụi nhỏ:Timespan.FromMinutes(5)
Michael Haren

2
@MichaelHaren Tôi không biết điều đó, điều đó rất hay. Cảm ơn bạn!
asawyer 22/10/12

4
@asawyer Rất tiếc, việc triển khai của bạn gặp lỗi biên dịch. TotalMillisecondstrả về gấp đôi trong khi bộ định thời kỳ vọng số nguyên hoặc TimeSpan. Tôi đã cố gắng cập nhật câu trả lời của bạn cho một câu trả lời sử dụng TimeSpanvà loại bỏ những thứ không cần thiết; tuy nhiên, bạn đã hoàn nguyên nó.
André C. Andersen

2
@ AndréChristofferAndersen Thay đổi 0 trong hàm tạo Thời gian thành TimeSpan.Zero. Mã hoạt động sau này.
RredCat

2
Mã báo lỗi. Đây là bản sửa lỗi System.Threading.Timer ((e) => {Func ();}, null, TimeSpan.Zero, TimeSpan.FromMinutes (1) .TotalMilliseconds);
Asheh

54

Tôi dựa trên câu trả lời của @ asawyer. Anh ta dường như không gặp lỗi biên dịch, nhưng một số người trong chúng ta thì có. Đây là phiên bản mà trình biên dịch C # trong Visual Studio 2010 sẽ chấp nhận.

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

12
Nhận xét cho hậu thế. Nó sẽ dừng khi bạn gọi Dispose()phương thức trên đối tượng hẹn giờ. Ví dụ: timer.Dispose()sử dụng đoạn mã trên làm tài liệu tham khảo. Tuy nhiên, điều này sẽ phá hủy bộ đếm thời gian và ngăn bạn sử dụng lại. timer.Change(Timeout.Infinite, Timeout.Infinite)sẽ tốt hơn nếu bạn muốn sử dụng lại bộ hẹn giờ trong cùng một chương trình.
Joel Trauger

1
Nhưng tại sao MyMethod () không chạy khi tôi chạy nó trong ứng dụng giao diện điều khiển
Izuagbala

@Izuagbala Thật khó để nói lý do tại sao nó không hoạt động với bạn nếu không biết chi tiết về cách bạn đã thiết lập nó. Giải pháp này đã được thử nghiệm trong một ứng dụng console.
André C. Andersen,

Null là gì?
Daniel Reyhanian

@DanielReyhanian Bạn có thể thêm trạng thái đối tượng thay cho trạng thái đối tượng null, đó là đối số khi gọi hàm gọi lại (tức là đối số đầu tiên).
André C. Andersen,

7

Khởi động bộ đếm thời gian trong hàm tạo của lớp bạn. Khoảng thời gian tính bằng mili giây nên 5 * 60 giây = 300 giây = 300000 mili giây.

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

Sau đó, gọi GetData()trong timer_Elapsedsự kiện như sau:

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

4

Tôi đã tải lên một Gói Nuget có thể làm cho nó rất đơn giản, bạn có thể có nó từ đây ActionScheduler

Nó hỗ trợ .NET Standard 2.0

Và đây là cách bắt đầu sử dụng nó

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.

Không thể cài đặt gói 'CrystalJobScheduler 1.0.0'. Bạn đang cố gắng cài đặt gói này vào một dự án nhắm mục tiêu '.NETFramework, Version = v4.5', nhưng gói này không chứa bất kỳ tham chiếu lắp ráp hoặc tệp nội dung nào tương thích với khung đó. Để biết thêm thông tin, hãy liên hệ với tác giả gói.
Aditya Bokade,

4

Ví dụ về việc sử dụng 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
Bộ đếm thời gian phù hợp hơn.
Chuck Conway

1
yup nếu có bất cứ điều gì sử dụng chờ đợi Task.Delay (60 * 5 * 1000);
CMS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.