2012-10-22 34 views
58

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

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

hoặc System.Timers.Timer - http://www.dotnetperls.com/timer – sinanakyazici

Trả lời

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

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

Một cách khác để đặt khoảng thời gian bằng cách truyền trong đối tượng timepan. Tôi nghĩ rằng đó là một chút sạch hơn: ['Timespan.FromMinutes (5)'] (http://msdn.microsoft.com/en-us/library/system.timespan.fromminutes.aspx) –

+2

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

+0

Tôi nghĩ rằng có một vấn đề với đối tượng timepan vì nó không phải là loại phù hợp (như là), so với chỉ '0, 5 * 60 * 1000'. Dù sao, đối với tôi nó tạo ra một lỗi. – amiregelz

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

Bộ hẹn giờ phù hợp hơn. –

+2

không phải là nó không hiệu quả để sử dụng thread.sleep ??? –

+1

Không chỉ thiếu hiệu quả mà còn khóa luồng quá – Gaspa79

42

tôi dựa trên câu trả lời @ asawyer của. Anh ta dường như không nhận được một lỗi biên dịch, nhưng một số người trong chúng ta làm. Đây là một phiên bản 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)); 
+2

Làm thế nào để ngăn chặn điều này? –

+5

Nhận xét về hậu thế. Nó sẽ dừng lại khi bạn gọi phương thức 'Dispose()' trên đối tượng timer. Ví dụ: 'timer.Dispose()' sử dụng mã ở trên làm tham chiếu. Điều này sẽ phá hủy bộ đếm thời gian, tuy nhiên và ngăn bạn sử dụng lại nó. 'timer.Change (Timeout.Infinite, Timeout.Infinite)' sẽ tốt hơn nếu bạn muốn sử dụng bộ đếm thời gian một lần nữa trong cùng một chương trình. –

1

Ví dụ về bộ hẹn giờ sử dụng.

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

Bắt đầu hẹn giờ trong hàm tạo của lớp học. Khoảng thời gian 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 trường hợp timer_Elapsed như thế này:

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

Tôi đã tải lên một gói NuGet có thể làm cho nó đơn giản như vậy, bạn có thể có nó từ đây CrystalJobScheduler

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

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

Không còn được liệt kê trên nuget.org – k3davis

+0

@ k3davis i đã cập nhật liên kết Nuget –

Các vấn đề liên quan