2010-07-21 17 views
7

Có bộ định thời .NET có sẵn trong C# có thể đảm bảo không có "trôi dạt" ở giữa các sự kiện không? Tức là, nếu bạn đặt hẹn giờ sẽ tắt sau mỗi X giây, thì sau vài ngày vận hành nó sẽ không trôi, tức là để đảm bảo rằng số lần tiếp cận các sự kiện X giây trong một ngày vẫn đồng bộ với những gì nó nên là?C# hẹn giờ kích hoạt mỗi X giây, nhưng vẫn đồng bộ với thời gian thực (tức là không có trôi dạt)

Nếu không, có một ví dụ mã nổi tiếng nào có thể quấn chức năng Hẹn giờ trong C# để thực hiện việc này không?

Trả lời

6

xin lỗi vì chỉ đem lại cho bạn một liên kết đến quartz.net, nhưng đây là một đầy đủ, doanh nghiệp, kiểm tra, ... thư viện ... bạn không cần phải phát minh lại bánh xe :)

nếu bạn lo lắng về chi phí, định nghĩa của bạn cho chi phí là gì? là nó kích thước tập tin (nhị phân là khoảng 0,5mb) hoặc trên không trong logic. cũng cho phần logic: tôi nghĩ rằng việc triển khai thực hiện giao diện IJob của họ thực hiện một công việc tốt để buộc mã tốt hơn của người tiêu dùng. Tôi không phải là người bạn lớn của các phương thức nội tuyến (như một ví dụ, vì bạn có thể kích hoạt các con trỏ của họ trên bộ đếm thời gian) - các lớp sẽ cung cấp cho bạn nhiều khả năng hơn, và một lần nữa, ép buộc oop tốt hơn, thiết kế tên miền, .. .

nhưng: làm Console.WriteLine(...) với quartz.net sẽ là quá mức cần thiết ... :)

+0

hiện nó thêm nhiều chi phí cho một ứng dụng WPF nhỏ Andreas? tức là trên và vượt ra ngoài cách tiếp cận mà Mikael đã đưa ra? (tức là ở mức độ nào nó sẽ sử dụng một búa tạ để crack một hạt để nói ở đây?) – Greg

+0

xem chỉnh sửa của tôi! ... –

+0

+1 Không biết về thư viện này, nhưng tôi chắc chắn sẽ ghi nhớ nó. –

15

Tôi giả sử bạn đã thử một cái gì đó rồi và nó đã trôi đi.

Nếu bạn muốn điều gì đó kích hoạt cứ 5 giây một lần từ giờ (5,10,15,20 ..), bạn có thể đặt hẹn giờ để kích hoạt một lần, sau đó gọi lại, hãy đặt lại bộ hẹn giờ để kích hoạt DateTime.Now + số giây đến khoảng thời gian 5 giây tiếp theo.

Điều này sẽ ngăn không cho bất kỳ hoạt động trôi nào miễn là đồng hồ của bạn chính xác.

Something như thế này

System.Timers.Timer timer = new Timer(); 

void Init() 
{ 
    timer.Elapsed += timer_Elapsed; 
    int wait = 5 - (DateTime.Now.Second % 5); 
    timer.Interval = wait*1000; 
    timer.Start(); 
} 


void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    timer.Stop(); 
    int wait = DateTime.Now.Second % 5; 
    timer.Interval = wait * 1000; 
    timer.Start(); 
} 
+1

âm thanh tốt - tôi đoán tôi đã tự hỏi nếu có chưa một chức năng mà sẽ làm việc này đã bị chôn vùi trong .NET khuôn khổ một nơi nào đó – Greg

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