2012-09-21 38 views
115

thể trùng lặp:
How do you add a timer to a C# console applicationCách tốt nhất để thực hiện "hẹn giờ" là gì?

cách tốt nhất để thực hiện một bộ đếm thời gian là gì? Một mẫu mã sẽ là tuyệt vời! Đối với câu hỏi này, "tốt nhất" được định nghĩa là đáng tin cậy nhất (ít nhất là số lượng misfires) và chính xác. Nếu tôi chỉ định khoảng thời gian 15 giây, tôi muốn phương thức đích được gọi mỗi 15 giây, không phải cứ 10 - 20 giây một lần. Mặt khác, tôi không cần độ chính xác nano giây. Trong ví dụ này, nó sẽ được chấp nhận cho phương pháp để bắn mỗi 14.51 - 15.49 giây.

+2

Một câu hỏi lớn được đánh dấu là trùng lặp mà không cần bất kỳ liên kết hữu ích trỏ đến từ khóa trùng lặp giải thích tốt này – pixel

Trả lời

206

Sử dụng lớp Timer.

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

public static void Main() 
{ 
    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
    aTimer.Interval=5000; 
    aTimer.Enabled=true; 

    Console.WriteLine("Press \'q\' to quit the sample."); 
    while(Console.Read()!='q'); 
} 

// Specify what you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    Console.WriteLine("Hello World!"); 
} 

Sự kiện Elapsed sẽ được nâng lên mỗi số tiền X mili giây, theo quy định của Interval tài sản trên các đối tượng Timer. Nó sẽ gọi Event Handler phương pháp bạn chỉ định, trong ví dụ trên đó là OnTimedEvent

+5

Có bộ đếm thời gian thực thi trên một thread riêng biệt? –

+7

@VaughanHilts, câu trả lời ngắn gọn, Có. Câu trả lời dài, xem lại [câu trả lời SO này] (http: // stackoverflow.com/a/1436331/1630665) giải thích những gì bộ đếm thời gian trôi qua rất tốt. –

+3

Có thể ai đó có nhiều thông tin cá nhân hơn tôi có thể chỉnh sửa điều này: Thuộc tính Khoảng thời gian chỉ định số mili giây, không phải giây giữa các sự kiện. – Matthias

19

Nó không rõ ràng loại ứng dụng mà bạn đang đi để phát triển (desktop, web, giao diện điều khiển ...)

Các câu trả lời chung, nếu bạn đang phát triển ứng dụng Windows.Forms, đang sử dụng

System.Windows.Forms.Timer lớp học. Lợi ích của việc này là nó chạy trên UI chủ đề, do đó, nó đơn giản chỉ cần xác định nó, đăng ký với sự kiện Tick của nó và chạy mã của bạn trên mỗi 15 giây.

Nếu bạn làm điều gì đó khác thì hình thức cửa sổ (nó không phải là rõ ràng từ các câu hỏi), bạn có thể chọn System.Timers.Timer, nhưng này một chạy trên chủ đề khác, vì vậy nếu bạn đang đi để hành động dựa trên một số yếu tố giao diện người dùng từ sự kiện Elapsed của nó, bạn phải quản lý nó bằng truy cập "gọi".

26

Bằng cách sử dụng System.Windows.Forms.Timer lớp bạn có thể đạt được những gì bạn cần.

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); 


t.Interval = 15000; // specify interval time as you want 
t.Tick += new EventHandler(timer_Tick); 
t.Start(); 

void timer_Tick(object sender, EventArgs e) 
{ 
     //Call method 
} 

Bằng cách sử dụng phương thức stop(), bạn có thể ngừng hẹn giờ.

t.Stop(); 
+1

Nếu có, bạn có thể chỉ cần kéo điều khiển hẹn giờ vào biểu mẫu của mình từ Hộp công cụ và thực hiện tất cả những điều trên cho bạn. –

+0

@RobSedgwick Có, tôi đồng ý với bạn. chúng ta có thể thêm điều khiển hẹn giờ thông qua hộp công cụ. Nhưng cách tiếp cận mà tôi chia sẻ là thông qua thời gian chạy thêm bộ đếm thời gian. –

2

Reference ServiceBase đến lớp học của bạn và đặt mã dưới đây trong trường hợp OnStart:

Constants.TimeIntervalValue = 1 (giờ) .. Lý tưởng nhất là bạn nên thiết lập giá trị này trong tập tin cấu hình.

StartSendingMails = tên hàm bạn muốn chạy trong ứng dụng.

protected override void OnStart(string[] args) 
     { 
      // It tells in what interval the service will run each time. 
      Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000; 
      base.OnStart(args); 
      TimerCallback timerDelegate = new TimerCallback(StartSendingMails); 
      serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval)); 
     } 
+0

-1 OP đề cập đến một ứng dụng giao diện điều khiển - không có lý do gì để đưa các lớp Dịch vụ Windows vào đó. Đặc biệt khi, để giải quyết vấn đề, bạn đang sử dụng cùng một lớp Timer như câu trả lời được chấp nhận. – TarkaDaal

+3

điều này được hiển thị trong một dịch vụ nhưng có thể áp dụng cho bất kỳ mã nào. KHÔNG đề cập đến @TarkaDaal. giao diện điều khiển không được đề cập trong bài đăng này. chỉ trong bản sao có thể. –

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